使用 PHP 5.3 命名空间按字符串实例化类

2022-08-30 12:53:28

我无法解决使用字符串变量和 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上是一致的,但在更高版本中不是这样。有没有解决这个问题的方法?


答案 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"

推荐