是否有可能由一个字符串表示“调用”一个类的实例?
在这种情况下,我会想到的代码如下所示:
class MyClass {
public $attribute;
}
$obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass
$obj->attribute = "Hello World";
我想这一定是可能的,因为PHP的SoapClient的接受它用来映射一个WSDL元素的PHP类classMappings的列表。 但如何是SoapClient的“调用”的类的实例?
$class = 'MyClass';
$instance = new $class;
但是,如果你的类的构造函数接受可变数量的参数,和你在一个数组持有这些参数(有点call_user_func_array
),你必须使用反射:
$class = new ReflectionClass('MyClass');
$args = array('foo', 'bar');
$instance = $class->newInstanceArgs($args);
还有ReflectionClass::newInstance
,但它同样的事情上面的第一个选项。
参考:
- 对象实例
- ReflectionClass :: newInstanceArgs()
- ReflectionClass ::的newInstance()
其他答案将在PHP <= 5.5的工作,但这个任务变得在PHP 5.6容易很多,你甚至不必使用反射。 做就是了:
<?php
class MyClass
{
public function __construct($var1, $var2)
{}
}
$class = "MyClass";
$args = ['someValue', 'someOtherValue'];
// Here's the magic
$instance = new $class(...$args);
如果通过构造函数需要的参数个数是已知的,恒定的,你可以(如其他人所说)做到这一点:
$className = 'MyClass';
$obj = new $className($arg1, $arg2, etc.);
$obj->attribute = "Hello World";
作为替代,你可以使用反射。 这也意味着你可以提供一个数组构造参数,如果你不知道你会需要多少。
<?php
$rf = new ReflectionClass('MyClass');
$obj = $rf->newInstanceArgs($arrayOfArguments);
$obj->attribute = "Hello World";