Ответ 1
$class = 'Application\Log\MyClass';
$object = new $class();
Начальный \
вводит (полностью квалифицированный) идентификатор имен, но он не является частью самого имени класса.
Я не могу обойти проблему, создающую новый класс, используя строковую переменную и PHP 5.3. Пространства имен. Например, это работает;
$class = 'Reflection';
$object = new $class();
Однако это не так:
$class = '\Application\Log\MyClass';
$object = new $class();
Произошла фатальная ошибка, указывающая, что класс не найден. Однако он, очевидно, может быть создан при использовании FQN i.e.;
$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"