Я не могу обойти проблему, создающую новый класс, используя строковую переменную и PHP 5.3. Пространства имен. Например, это работает;
$class = 'Reflection'; $object = new $class();
Однако это не так;
$class = '\Application\Log\MyClass'; $object = new $class();
Произошла фатальная ошибка, указывающая, что класс не может быть найден. Однако он, очевидно, может быть создан при использовании FQN, т.е.
$object = new \Application\Log\MyClass;
Я нашел, что это aparrent на PHP 5.3.2-1, но не в более поздних версиях. Есть ли для этого работа?
$class = 'Application\Log\MyClass'; $object = new $class();
Начальный \
вводит (полностью квалифицированный) идентификатор с именами, но он не является частью самого имени класса.
Другой способ добиться такого же результата, но с динамическими аргументами, заключается в следующем. Пожалуйста, рассмотрите класс ниже как класс, который вы хотите создать.
<?php // test.php namespace Acme\Bundle\MyBundle; class Test { public function __construct($arg1, $arg2) { var_dump( $arg1, $arg2 ); } }
А потом:
<?php require_once('test.php'); (new ReflectionClass('Acme\Bundle\MyBundle\Test'))->newInstanceArgs(['one', 'two']);
Если вы не используете последнюю версию PHP, используйте следующий код, который заменяет последнюю строку вышеприведенного примера:
$r = new ReflectionClass('Acme\Bundle\MyBundle\Test'); $r->newInstanceArgs(array('one', 'two'));
Код выдаст следующий результат:
string(3) "one" string(3) "two"