Я пытаюсь создать экземпляр класса (модель Laravel3 Eloquent) переменной, и я получаю сообщение о том, что класс не найден.
Однако, когда я жестко кодирует имя класса, он работает отлично.
(FYI, в коде ниже $contact_type
ожидается либо телефон, факс, либо электронная почта).
Вот что я сейчас играю:
foreach( $input AS $contact_type => $contact_info ) { foreach( $contact_info AS $data ) { $obj = new $contact_type( (array)$data); echo'<pre>Obj: ',print_r($obj),'</pre>'; // <----- For Testing } }
Когда я запускаю код, как указано выше, он выдает ошибку «Class» Phone «not found» .
Когда я заменяю new $contact_type()
new Phone()
(или факсом или электронной почтой), он работает нормально.
Бьюсь об заклад, есть что-то простое, я просто смотрю 🙂 Что мне не хватает?
Пожалуйста помоги!
Соответствующие ручные записи, которые охватывают это, здесь и здесь . Чтобы процитировать вторую ссылку:
Если строка, содержащая имя класса, используется с новым, будет создан новый экземпляр этого класса. Если класс находится в пространстве имен, при его использовании должно использоваться его полное имя.
Это работает для меня:
class Phone {} $classtype = 'Phone'; $phone = new $classtype(); var_dump($phone);
Производит вывод:
object(Phone)#1 (0) { }
Убедитесь, что вы не находитесь в пространстве имен (включая пространство имен «Телефон» в строке, если вы есть). Или вы также можете попробовать использовать отражение:
class Phone {} $classtype = 'Phone'; $reflectionClass = new ReflectionClass($classtype); $phone = $reflectionClass->newInstanceArgs(); var_dump($phone);
Если класс Phone находится в пространстве имен, это также работает:
Phone.php
<?php namespace Contact; class Phone {}
test.php
<?php include 'Phone.php'; $classtype = 'Contact\Phone'; $phone = new $classtype(); var_dump($phone);
Я не уверен на 100%, почему, хотя я подозреваю, что при оценке имени класса переменной текущие сопоставления пространства имен не видны. Рассмотрим этот код:
<?php namespace Foo; use SomePackage\SomeClass as WeirdName; $test = new WeirdName();
Сравните это с:
<?php namespace Foo; use SomePackage\SomeClass as WeirdName; $class = 'WeirdName'; $test = new $class();
Когда PHP решает выделить память для нового экземпляра, как он узнает, чтобы сопоставить псевдоним имени класса WeirdName
с SomePackage\Someclass
? Этот псевдоним действителен только для текущего файла, а код, который фактически выполняет эту операцию, даже не в коде userland , а тем более в том же файле.