Intereting Posts
Убедитесь, что строка соответствует требуемому формату Fontawesome шрифты терпят неудачу после активов: установить и уснуть: дамп PHP simplehtmldom добавления атрибутов Пользовательский селектор выпадающего меню, отображающий или скрывающий другие настраиваемые поля Checkout Настройка Paypal для подключения к скрипту Как я могу отправить данные div в MySQL Форма электронной почты PHP отправляет электронную почту каждую страницу обновляется Как отображать только одну информацию за один раз в онлайн-викторине Laravel назвал маршрут для контроллера ресурсов Как проверить, существует ли уже существующее значение, чтобы избежать дублирования? CodeIgniter – Загрузка CSS Многократная загрузка файлов Symfony2 с использованием метода add / remove Обнаружение искателя php php включает файл, который включает извлекать и вставлять изображение в базу данных с помощью php

Проблема spl_autoload_register при загрузке класса

Поэтому я уже задал этот вопрос здесь ранее, но предоставленные решения не сработали для меня. Вот моя настройка:

/mylib /Vendor/Module/MyClass.php /document_root index.php 

Вот мой index.php

 <?php define('CLASSDIR', 'mylib'); define('BASEPATH', @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR); spl_autoload_register(null, false); spl_autoload_extensions('.php'); function autoLoader($className){ $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strrpos($className, '\\')) { echo 'does it come here? nope.'; $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; } spl_autoload_register('autoLoader'); //$obj = new MyClass(); $obj = new \Vendor\Module\MyClass(); $obj::test(); ?> 

Вот мой MyClass.php

 <?php namespace Vendor\Module; class MyClass{ public function __construct(){ echo 'weird'; } public function test(){ echo 'strange'; } } ?> 

Ничто из моего эха ничего не отображает. Очевидно, что мой класс также не загружен. Вместо этого я получаю эту ошибку.

 Fatal error: Call to undefined method MyClass::test() in /<documentroot>/index.php on line 29 

Пожалуйста помоги. Я давно застрял в этом, и все остальное мое развитие страдает. Я попытался переместиться в spl_autoload_register() только потому, что это рекомендуется. Теперь потерянное время заставляет меня сожалеть об этом.

Вы неправильно вызываете функцию test() (используя статический путь?).

Вызовите функцию с помощью:

 $obj = new MyClass(); $obj->test(); 

Если вы намереваетесь использовать статический метод, например MyClass::test() , объявите свою функцию в своем классе как:

 public static function test() { } 

Кроме того, ваш автозагрузчик слишком сложный. Его можно упростить как:

 $class_dir = array( '/mylib/Vendor/Module/', // Add more paths here ( or you can build your own $class_dir ) ); function class_loader($class_name) { global $class_dir; foreach ($class_dir as $directory) { if (file_exists($directory . $class_name . '.php')) { require_once($directory . $class_name . '.php'); return; } } } spl_autoload_register('class_loader'); 

Третья редакция:

Я заметил, что установленный вами путь неверен.

 $fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

Должен быть:

 $filename = BASEPATH .'/' . $filename . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

Как говорилось ранее, его можно легко отладить, повторив значение $filename .

F ** k да. Да, я могу взять на себя смелость поклясться в открытом форуме в этот раз.

Огромный крик @ Шиван Раптор за то, что он помог мне по пути и не сдался.

В функции автозагрузчика были многочисленные незначительные проблемы. Но отладка заставила меня так долго по простой причине, что я не мог видеть никаких эхо-сообщений. Только лорд и XAMPP знают почему. Казалось, что XAMPP каким-то образом кэшировал класс при первом запуске или что-то еще, и никакие изменения позже не показали никакого эффекта. Но создание нового класса и файла класса внезапно начало показывать все мои эхо, включая те, что внутри автозагрузки. Любой, кто взял код автозагрузки по приведенной ниже ссылке, убедитесь, что вы смотрите на все значения переменных. Он не работает «из коробки», если вы не храните все в корне документа. И если вы новичок в PSR-0 и концепции автоматической загрузки, это может убить как минимум значительную часть ваших идеально способных клеток мозга.

 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 

Вот окончательный index.php, который сработал для меня.

 <?php define('CLASSDIR', 'mylib'); define('BASEPATH', @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR); spl_autoload_register(null, false); spl_autoload_extensions('.php'); function autoLoader($className){ $className = ltrim($className, '\\'); $classPath = ''; $namespace = ''; if ($lastNsPos = strrpos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $classPath = str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR; } $fileName = BASEPATH.'/'.$classPath.str_replace('_', DIRECTORY_SEPARATOR, $className).'.php'; require $fileName; } spl_autoload_register('autoLoader'); $obj = new \Vendor\Module\MyClass(); $obj::test(); ?> 

'\\' следует заменить на '\' (или \\ требуется только с двойными кавычками "\\" )