问题
I can't get around an issue instantiating a new class by using a string variable and PHP 5.3. namespaces. For example, this works;
$class = 'Reflection';
$object = new $class();
However, this does not;
$class = '\Application\Log\MyClass';
$object = new $class();
A fatal error gets thrown stating the class cannot be found. However it obviously can be instantiated if using the FQN i.e.;
$object = new \Application\Log\MyClass;
I've found this to be aparrent on PHP 5.3.2-1 but not not in later versions. Is there a work around for this?
回答1:
$class = 'Application\Log\MyClass';
$object = new $class();
The starting \
introduces a (fully qualified) namespaced identifier, but it's not part of the class name itself.
回答2:
Another way to achieve the same result but with dynamic arguments is as follows. Please consider the class below as the class you want to instantiate.
<?php
// test.php
namespace Acme\Bundle\MyBundle;
class Test {
public function __construct($arg1, $arg2) {
var_dump(
$arg1,
$arg2
);
}
}
And then:
<?php
require_once('test.php');
(new ReflectionClass('Acme\Bundle\MyBundle\Test'))->newInstanceArgs(['one', 'two']);
If you are not using a recent version of PHP, please use the following code that replaces the last line of the example above:
$r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
$r->newInstanceArgs(array('one', 'two'));
The code will produce the following output:
string(3) "one"
string(3) "two"
来源:https://stackoverflow.com/questions/5072352/instantiating-class-by-string-using-php-5-3-namespaces