如何在PHP中“调用”一个类实例?

时间:2009-10-09 09:11:35

标签: php class instance invoke

是否有可能通过字符串表示“调用”类实例?

在这种情况下,我希望代码看起来像这样:

class MyClass {
  public $attribute;
}

$obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass
$obj->attribute = "Hello World";

我认为这一定是可能的,因为PHP的SoapClient接受一个classMappings列表,用于将WSDL元素映射到PHP类。但是SoapClient如何“调用”类实例?

3 个答案:

答案 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";