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