PHP: создание экземпляра класса из переменной нечетно не выполняется

Я пытаюсь создать экземпляр класса (модель 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 , а тем более в том же файле.