Я получаю эту ошибку, когда пытаюсь использовать автозагрузку и пространства имен:
Неустранимая ошибка: класс Class1 не найден в /usr/local/www/apache22/data/public/php5.3/test.php в строке 10
Может ли кто-нибудь сказать мне, что я делаю не так?
Вот мой код:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
AS
. Это решение работает не поэтому. Вы можете так же легко сделать:use Person\Barnes\David\Class1;
(что эквивалентноuse Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
для этого$class = new Class1();
. Сuse Person\Barnes\David;
тобой надо делать$class = new David\Class1();
. Самоuse
по себе ключевое слово является эквивалентомuse Person\Barnes\David\Class1 as Class1;
илиuse Person\Barnes\David as David;
соответственно для каждого примера.Как упоминал Паскаль МАРТИН, вы должны заменить '\' на DIRECTORY_SEPARATOR, например:
Также я бы посоветовал вам реорганизовать структуру каталога, чтобы сделать код более читабельным. Это может быть альтернатива:
Структура каталога:
Файл:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Файл:
/ProjectRoot/test.php
источник
Ваша
__autoload
функция получит полное имя класса, включая имя пространства имен.Это означает, что в вашем случае
__autoload
функция получит 'Person\Barnes\David\Class1
', и не только 'Class1
'.Итак, вы должны изменить свой код автозагрузки, чтобы иметь дело с таким «более сложным» именем; часто используемое решение - организовать ваши файлы, используя один уровень каталогов для каждого «уровня» пространств имен, и при автозагрузке заменить '
\
' в имени пространства имен наDIRECTORY_SEPARATOR
.источник
__autoload
функция получит полное имя класса, включая имя пространства имен» - это верно только в том случае, если вы явноuse
указали класс, на который пытаетесь сослаться, а не если вы просто указалиuse
пространство имен, которому он принадлежит. Ошибка OP заключалась в том, что он создалuse
пространство имен, содержащее класс, а затем ожидал, что его функция автозагрузки каким-то образом волшебным образом передаст полный путь к классам. Этот ответ на самом деле не касается ошибки OP.Я делаю что-то вроде этого: см. Этот пример на GitHub
источник
Я нашел эту жемчужину от Flysystem
источник
Я вижу, что функции автозагрузки получают «полное» имя класса со всеми предшествующими ему пространствами имен только в следующих двух случаях:
Я вижу, что функции автозагрузки НЕ получают полное имя класса в следующем случае:
ОБНОВЛЕНИЕ: [c] - это ошибка, и в любом случае это не так, как работают пространства имен. Я могу сообщить, что вместо [c] также хорошо работают следующие два случая:
Надеюсь это поможет.
источник
use
ключевое слово некорректно работает в интерактивном интерфейсе командной строки PHP (php --interactive
);Я использую этот простой прием в одну строчку:
источник
была такая же проблема, и я только что нашел это:
Когда вы создаете структуру подпапок, соответствующую пространствам имен содержащихся классов, вам даже не придется определять автозагрузчик.
Оно работало завораживающе
Подробнее здесь: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
РЕДАКТИРОВАТЬ: это вызывает проблему в Linux из-за обратной косой черты ... См. Здесь рабочее решение от immeëmosol
Автозагрузка пространства имен работает под Windows, но не под Linux
источник
Использование имеет подводный камень, хотя это, безусловно, самый быстрый метод, он также ожидает, что все ваши имена файлов будут в нижнем регистре.
Например:
Файл, содержащий класс SomeSuperClass, должен быть назван somesuperclass.php, это ошибка при использовании чувствительной к регистру файловой системы, такой как Linux, если ваш файл называется SomeSuperClass.php, но не проблема в Windows.
Использование __autoload в вашем коде может по-прежнему работать с текущими версиями PHP, но ожидается, что эта функция станет устаревшей и будет окончательно удалена в будущем.
Итак, какие варианты остались:
Эта версия будет работать с PHP 5.3 и выше и позволяет использовать имена файлов SomeSuperClass.php и somesuperclass.php. Если вы используете версию 5.3.2 и выше, этот автозагрузчик будет работать еще быстрее.
источник
str_replace ([ '_','\\'] '/', $className );
в два раза быстрее, чем два str_replaceЯ недавно нашел ответ tanerkuc очень полезным! Просто хотел добавить, что использование
strrpos()
+substr()
немного быстрее, чемexplode()
+end()
:источник
Я добавлю свои два цента для относительных новичков или еще чего-то, кто не хочет простой установки spl_autoload_register () без всякой теории: просто создайте один файл php для каждого класса, назовите этот файл php таким же, как имя вашего класса, и сохраните файлы классов в том же каталоге, что и ваш файл php, тогда это будет работать:
Погуглите детали внутри этой функции, чтобы понять, как она работает. PS: Я использую Linux, и это работает в Linux. Пользователи Windows должны сначала это проверить.
источник
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Вы захотите поместить файлы классов в папку с именем
Classes
, которая находится в том же каталоге, что и точка входа в ваше приложение PHP. Если классы используют пространства имен, они будут преобразованы в структуру каталогов.В отличие от многих других автозагрузчиков, подчеркивания не будут преобразованы в структуры каталогов (сложно создать псевдопространства имен PHP <5.3 вместе с реальными пространствами имен PHP> = 5.3).
Вы захотите поместить следующий код в свой основной скрипт PHP (точку входа):
Вот пример макета каталога:
источник
источник