Autoloader

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
macros_kh
Сообщения: 2
Зарегистрирован: 2017.06.15, 12:24

Autoloader

Сообщение macros_kh »

Доброго времени суток. Не совсем понятна работа автозагрузчика в Yii2.
Есть куча классов и от них потомки. Чтобы упростить поиск было принято решение сгруппировать их в поддиректориях. К примеру есть класс SomeClass и потомки SomeClassType1, SomeClassType2... Лежат эти классы в директории common\models\someclasses, соответственно неймспейс у классов такой же. Базовый класс является фабрикой, но при создании он не находит потомков. Причем если явно указывать класс

Код: Выделить всё

new SomeClassType1();
, то он находит, если через переменную

Код: Выделить всё

$className = 'SomeClassType1'; new $className();
то выдаст эксепшн.
Собственно вопрос заключается как решить данную проблему.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Autoloader

Сообщение ElisDN »

Код: Выделить всё

$className = 'common\models\someclasses\SomeClassType1';
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Autoloader

Сообщение mkramer »

В дополнении к ElisDN скажу, что это особенность php, описанная в документации. Если вы создаёте сайт из строки, то реально он создаётся где-то в недрах php, куда php не передаёт (хотя странно, почему бы ему этого не делать) информацию о текущем namespace и инструкциях use, поэтому там нужно использовать полное имя класса. Также вы можете использовать предопределённую константу ::class (если php >= 5.6, насколько помнится) или статическую функцию Yii className() (для классов, расширяющих Object):

Код: Выделить всё

$className = SomeClassType1::class;
// или
$className= SomeClassType1::className();
macros_kh
Сообщения: 2
Зарегистрирован: 2017.06.15, 12:24

Re: Autoloader

Сообщение macros_kh »

спасибо, понял что нужно полное имя спустя 2 минуты после публикации поста. К сожалению кнопки отмены публикации не нашел. Я почему-то думал что если классы лежат в одном неймспейсе, то php должен хавать и такой вариант.
Закрыто