Подтвердить что ты не робот

Создание экземпляров класса по строкам с использованием пространств имен PHP 5.3

Я не могу обойти проблему, создающую новый класс, используя строковую переменную и 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, но не в более поздних версиях. Есть ли для этого работа?

4b9b3361

Ответ 1

$class = 'Application\Log\MyClass';
$object = new $class();

Начальный \ вводит (полностью квалифицированный) идентификатор имен, но он не является частью самого имени класса.

Ответ 2

Другим способом достижения такого же результата, но с динамическими аргументами является следующий. Пожалуйста, рассмотрите класс ниже как класс, который вы хотите создать.

<?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"