Я использую spl_autoload_register для автозагрузки класса, например
Моя структура
index.php
Module\Autoloader.php
Module\MyClass.php
Test\test.php
в файле index.php
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
в файле Module\Autoloader.php
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
в файле Module\MyClass.php
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
в файле Test\test.php
MyClass::run();
Но есть ошибка
Fatal error: Uncaught Error: Class 'MyClass' not found in ..\Test\test.php
Как исправить это спасибо
@NigelRen да, но та же ошибка
spl_autoload_register('loader'); пробовали?
@u_mulder, я просто редактирую свой код, используя автозагрузку, вывод - Module/MyClass.php, но та же ошибка
попробуйте Module\MyClass::run() в test.php.
@Dormilich такая же ошибка Module/Module/MyClass.php echo и ошибка Fatal error: Uncaught Error: Class 'Module\MyClass' not found






ваша проблема в том, что вы добавляете __DIR__
__DIR__ основан на том, где находится файл, из которого он вызывается:
__DIR__The directory of the file. If used inside an include, the directory of the included file is returned. This is equivalent to dirname(
__FILE__). This directory name does not have a trailing slash unless it is the root directory.
http://php.net/manual/en/language.constants.predefined.php
Так как ваша процедура автозагрузки находится в ./Module/
__DIR__ не вернет / при вызове из index.php, но будет возвращать Module, что сделает ваш готовый путь к классам Module/Module/MyClass.php, который, очевидно, не может быть найден.
Либо используйте другие средства добавления каталога, например, заранее определенный список, используйте первую часть пространства имен (так что просто откажитесь от __DIR__), либо переместите классы в расположение относительно каталога, в котором находится ваш включаемый файл.
я так не думаю. В моей строке echo $filename.'<br>'; он повторяет правильный ..\test\Module/MyClass.php, но получает фатальную ошибку Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php
Вам по-прежнему нужен use Module\MyClass или назовите его как Module\MyClass, требование правильного именования не меняется.
извините, но я не понимаю, у меня use Module\MyClass; в моем index.php?
этот псевдоним используется в контексте этого файла (index.php). Таким образом, в контексте файла test.php вам нужно либо снова выполнить оператор use, либо указать полностью классифицированное имя. (даже если вы его включите)
Кажется, use Module\MyClass; в index.php избыточен, а в Test\test.php должен быть require_once ("Module\MyClass.php"); use Module\MyClass;?
он не обязательно избыточен, он просто используется в контексте кода в файле index.php. Вам просто нужно убедиться, что код в test.php также имеет доступ к полному имени, либо через псевдоним, либо используя полное имя класса.
Ваш автозагрузчик находится внутри каталога модулей, поэтому он добавит дополнительный «Модуль», когда вы попытаетесь добавить «DIR» к полному имени класса. Расположение файла будет примерно таким:
../Module/Module/MyClass.php
Попробуйте переместить автозагрузчик в тот же каталог, что и index.php, или измените его следующим образом:
<?php
class Autoloader {
static public function loader($className) {
$filename = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
str_replace("\\", DIRECTORY_SEPARATOR, $className) . ".php";
if (file_exists($filename)) {
include($filename);
} else {
echo "$filename not found!\n";
}
}
}
spl_autoload_register('Autoloader::loader');
Я пробую ваше предложение, но не работает. Я думаю, что MyClass был загружен b / c, когда я повторяю ..\test\Module/MyClass.php, это правильный путь. но все равно получаю фатальную ошибку Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php
Выведите
$filename, проверьте, что это правильный и указывает на существующий файл.