Создание класса с помощью строки с использованием пространств имен PHP 5.3 - PullRequest
35 голосов
/ 22 февраля 2011

Я не могу обойти проблему создания нового класса с помощью строковой переменной и PHP 5.3.Пространства имен.Например, это работает;

$class = 'Reflection';
$object = new $class();

Однако это не так;

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

Возникает фатальная ошибка, сообщающая, что класс не найден.Тем не менее, очевидно, что его можно создать, если использовать FQN, т.е.

$object = new \Application\Log\MyClass;

. Я обнаружил, что это происходит в PHP 5.3.2-1, но не в более поздних версиях.Есть ли обходной путь для этого?

Ответы [ 2 ]

66 голосов
/ 22 февраля 2011
$class = 'Application\Log\MyClass';
$object = new $class();

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

5 голосов
/ 25 марта 2014

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

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