Intereting Posts
Amazon api не удаляет мои продукты из инвентаря Как создать несколько массивов PHP в функции для параметров, переданных по ссылке? Отключить ввод javascript в форму Как загружать изображения на Php-сервер и хранить в phpmyadmin php regex для извлечения данных из таблицы HTML Простая форма PHP, похоже, не работает Как получить год и месяц с даты – PHP Вставка большого количества переменных в таблицу с использованием PDO Кэшированные, PHP генерируемые миниатюры загружаются медленно Использование двойных кавычек в значении 'input type = "text"' не работает, строка останавливается при двойной кавычке! Наименее интенсивный способ чтения файла в PHP Использование PHP для преобразования символа ASCII в десятичный эквивалент Веб-сайт IIS не смог открыть поток: нет такого файла или каталога в C: \ inetpub \ vhosts \ ", но файл существует там Пользовательский агент CURL Ошибка «Преждевременный конец данных» с PHP

Пространство имен PHP и динамическое имя класса

Я столкнулся с «странной» вещью, экспериментируя с spl_autoload, пространствами имен и динамическими именами классов. Я использую PHP 5.3.2, вызываю автозагрузку, как это

set_include_path(get_include_path().PATH_SEPARATOR."classes".PATH_SEPARATOR."utils"); spl_autoload_extensions(".class.php"); spl_autoload_register(); 

Теперь к сути. Предложите следующий код:

 new \User\Student; $name="\User\Student"; new $name(); 

Это отлично работает, файлы классов / user / student.class.php загружаются успешно, обе конструкции успешны. Однако, немного другое использование:

 $name="\User\Student"; new $name(); new \User\Student; 

не удается выполнить «..Class \ User \ Student не может быть загружен …». Я полагаю, что это должно быть связано с разрешением статического / динамического пространства имен каким-то образом. Тем не менее, я не думаю, что между этими двумя должно быть различие, за исключением времени, в течение которого они обрабатываются (компиляция или время выполнения).

Спасибо за любое объяснение.

«Проблема» здесь на самом деле находится на более низком уровне, чем SPL, и также можно увидеть с помощью __autoload() . Это лучше всего демонстрируется в коде:

 function __autoload ($class) { echo "Loading $class\n"; } new Test; // displays "Loading Test" $var = 'Test'; new $var; // displays "Loading Test" // However, when we introduce namespaces... new \This\Is\A\Test; // displays "Loading This\Is\A\Test" $var = '\This\Is\A\Test'; new $var; // displays "Loading \This\Is\A\Test" 

Обратите внимание, как при введении пространств имен ведущая косая черта не передается функции при вызове статически, но она называется динамически.

Поэтому решение состоит в том, чтобы выполнить любую из этих довольно простых вещей:

  • Удалите основную косую черту из динамического имени класса.
  • Оберните spl_autoload() по умолчанию следующим образом:
 set_include_path(get_include_path().PATH_SEPARATOR."classes".PATH_SEPARATOR."utils"); spl_autoload_extensions(".class.php"); spl_autoload_register(function($class) { spl_autoload(ltrim($class, '\\')); }); 

Конечно, если вы это сделаете, вы также можете удалить вызов spl_autoload_extensions() и просто передать строку ".class.php" ко второму аргументу spl_autoload()