Kev*_*vin 35 php namespaces autoload
我无法通过使用字符串变量和PHP 5.3来解决实例化新类的问题.命名空间.例如,这有效;
$class = 'Reflection';
$object = new $class();
Run Code Online (Sandbox Code Playgroud)
但是,这不是;
$class = '\Application\Log\MyClass';
$object = new $class();
Run Code Online (Sandbox Code Playgroud)
抛出致命错误,说明无法找到该类.然而,如果使用FQN,它显然可以被实例化;
$object = new \Application\Log\MyClass;
Run Code Online (Sandbox Code Playgroud)
我发现这在PHP 5.3.2-1中是常见的,但在后来的版本中并非如此.有没有解决这个问题?
Art*_*cto 66
$class = 'Application\Log\MyClass';
$object = new $class();
Run Code Online (Sandbox Code Playgroud)
首发\
引入了一个(完全限定的)命名空间标识符,但它不是类名本身的一部分.
使用动态参数获得相同结果的另一种方法如下.请将下面的类视为要实例化的类.
<?php
// test.php
namespace Acme\Bundle\MyBundle;
class Test {
public function __construct($arg1, $arg2) {
var_dump(
$arg1,
$arg2
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
<?php
require_once('test.php');
(new ReflectionClass('Acme\Bundle\MyBundle\Test'))->newInstanceArgs(['one', 'two']);
Run Code Online (Sandbox Code Playgroud)
如果您没有使用最新版本的PHP,请使用以下代码替换上面示例的最后一行:
$r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
$r->newInstanceArgs(array('one', 'two'));
Run Code Online (Sandbox Code Playgroud)
代码将产生以下输出:
string(3) "one"
string(3) "two"
Run Code Online (Sandbox Code Playgroud)