2013-05-28 2 views
0
use my\Project\FooClass; 

$obj = new FooClass(); // ok 
$name = 'FooClass'; 
$obj2 = new $name(); // throws an error that the class wasn't found 

Хорошо, я считаю, что заголовок и пример были достаточно подробным объяснением моего вопроса, так что просто - почему это порождает ошибку и как мне с этим справиться?Использовать ключевые слова и имена динамических классов

+0

Можете ли вы просто опустить()? –

+0

Я использую эту технику все время без проблем, единственное отличие в том, что я не пробовал ее с пространствами имен. Попробуйте установить $ name в namespaced classname 'my \ Project \ FooClass' – Orangepill

ответ

2

К сожалению, это невозможно из-за способа импорта/псевдонимов PHP из пространств имен. Это можно исправить, используя литеральные определения пространства имен, хотя это, без сомнения, отстой.

Как следует:

$r = "my\\Project\\FooClass"; 
$k = new $r(); 

Существует патч в работах, или, по крайней мере, это было на сообщение об ошибке в PHP пару месяцев назад. Они, надеюсь, что-то с этим поделают.

Если это вас беспокоит, вы можете использовать class_alias(), чтобы исправить это, кстати.

0

попробовать:

$obj2 = new $name; 

Снимите скобку

В качестве альтернативы:

$obj2 = new {$name}(); 
+0

Ничего не работает, во-вторых, это синтаксическая ошибка. – user2252786

+0

Что говорит синтаксическая ошибка? Я использую '$ obj = new $ someClass;' в моих собственных приложениях, и он отлично работает! Weird! –

+0

Я имел в виду альтернативу - новое {$ name}(); – user2252786

0

Не могу объяснить, почему это не работает. Но о том, как с этим бороться:

$name = 'FooClass'; 
$name = "my\\Project\\FooClass\\" . $name; // prepend namespace 
$obj2 = new $name();