是否有可能通过字符串表示“调用”类实例?
在这种情况下,我希望代码看起来像这样:
class MyClass {
public $attribute;
}
$obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass
$obj->attribute = "Hello World";
我认为这一定是可能的,因为PHP的SoapClient接受一个classMappings列表,用于将WSDL元素映射到PHP类。但是SoapClient如何“调用”类实例?
答案 0 :(得分:24)
$class = 'MyClass';
$instance = new $class;
但是,如果您的类'构造函数接受可变数量的参数,并且您将这些参数保存在数组中(类似call_user_func_array
),则必须使用反射:
$class = new ReflectionClass('MyClass');
$args = array('foo', 'bar');
$instance = $class->newInstanceArgs($args);
还有ReflectionClass::newInstance
,但它与上面的第一个选项完全相同。
参考:
答案 1 :(得分:8)
其他答案将在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);
答案 2 :(得分:6)
如果构造函数所需的参数数量已知且不变,您可以(正如其他人所建议的那样)执行此操作:
$className = 'MyClass';
$obj = new $className($arg1, $arg2, etc.);
$obj->attribute = "Hello World";
作为替代方案,您可以使用Reflection。这也意味着如果你不知道需要多少个,你可以提供一组构造函数参数。
<?php
$rf = new ReflectionClass('MyClass');
$obj = $rf->newInstanceArgs($arrayOfArguments);
$obj->attribute = "Hello World";