PHP: <?php namespace framework; use framework\Foo\Foo; class ClassName { public function test($className) { new $className; } } ?> Если передать в метод 'test' какое-то значение для создание экземпляра класса PHP: $this->test('foo'); Вылазит ошибка, что такого класса не существует. Но если прописать имя класса вручную, внутри метода т.е. PHP: public function test($className) { new Foo; } То всё отрабатывает нормально. Кроме этого будет отрабатывать нормально если указывать полный путь к расположению файла класса т.е. вот так: PHP: public function test($className) { $path = 'framework\Foo\\'.$className; new $path; } И как бы постоянно передавать путь, ну как бы не очень красиво получается. PS: нашел подобный вопрос тут на форуме: https://php.ru/forum/threads/namesp...et-podkljuchenie-klassov-iz-peremennoj.58286/ Выходит только полный путь, либо делать какой-то массив для ассоциаций, в который будет улетать короткое имя, от туда будет браться полный путь и подставляться, т.к. какой-то велосипед
Я так понял, что если всё это генерится через композер, то как раз таки нужно именно в json файле композера это всё прописать?
Не понял, к чему это и куда прописать? --- Добавлено --- Пробовал с композером разобраться, но что-то либо я что-то не понимаю и соответственно делаю не так и оно не работает, либо оно через него и не должно работать, хотя я больше склоняюсь к первому, что я что-то не то делаю.
Ну молодец же! Всё нашёл, что надо. Да, когда имя класса в переменной, то неймспейс из use не подклеивается к имени класса, поэтому надо указывать имя вместе с неймспейсом. Или, можно извернуться и сделать алиасы для классов, видимо это типа как ты хотел "массив для ассоциаций", только оно тебе зачем?! Просто пойми как классы используются и не наступай на грабли.
Решил сделать вот так: PHP: private function classNames($className) { $classNames = [ 'Foo'=>'framework\Foo\Foo', 'Bar'=>'framework\Bar\Bar' ]; return $classNames[$className]; } Так как есть наследники, я решил что проще все пути указать в родителе, а в дочерних просто обращаться по имени. Так будет даже удобнее если вдруг структура изменится, тогда будет достаточно просто изменить в родителе пути и все.
Тебе @MouseZver попытался подсказать, но не очень понятно. я тоже только со второго раза понял. вместо test('foo') пиши test(foo::class) и тогда в параметр подставится полное имя вместе с неймспейсом!!! магия!!!
да, я про это знал, но подставится неймспейс, а по use класс находится в другом месте и поэтому ошибка выходит.
омайгад! ты любишь всё усложнять? --- Добавлено --- если неправильно использовать, то конечно будет ошибка. исправлять ошибки с помощью других ошибок не надо. --- Добавлено --- PHP: <?php namespace App\Containers\Models; use Illuminate\Database\Eloquent\Model; class Container extends Model { ... } Model "разворачивается" в \Illuminate\Database\Eloquent\Model. а не \App\Containers\Models\Model. такое использование тебе понятно? здесь нет ошибки. точно также будет разворачиваться в такой конструкции PHP: print('Model'); // выведет "Model" print(Model::class); // выведет "\Illuminate\Database\Eloquent\Model" как можно здесь накосячить? только если забыть задать этот класс в use. тогда будет использоваться текущий неймспейс, а не тот, который надо.
Тысячи благодарностей! Проблема в том что ошибка вылазила по той причине, что делалось это мной криворуко. Сейчас с помощью более развернутой инфы всё норм!
Но вот загвоздка. Всё это работает только в родительском классе, там где конкретно прописан USE, а если я наследуюсь и расшираю метод, то PHP: print(Model::class); выдаст -> немспейс\Model а если пропишу в этом файле USE то будет корректно И получается что если наследоваться то USE нужно постоянно тягать и выходит что дублировать. И выходит что этот "ОМАЙГАД" PHP: private function classNames($className) { $classNames = [ 'Foo'=>'framework\Foo\Foo', 'Bar'=>'framework\Bar\Bar' ]; return $classNames[$className]; } избавляет от дублирования USE в наследниках Либо я снова что-то недопонимаю.