9

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

在这种情况下,我希望代码如下所示:

class MyClass {
  public $attribute;
}

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

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

4

3 回答 3

26
$class = 'MyClass';
$instance = new $class;

但是,如果您的类的构造函数接受可变数量的参数,并且您将这些参数保存在数组中(类似于call_user_func_array),则必须使用反射:

$class = new ReflectionClass('MyClass');
$args  = array('foo', 'bar');
$instance = $class->newInstanceArgs($args);

也有ReflectionClass::newInstance,但它与上面的第一个选项做同样的事情。

参考:

于 2009-10-09T09:13:14.320 回答
13

其他答案将在 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);
于 2015-02-13T15:48:38.817 回答
6

如果构造函数所需的参数数量是已知且恒定的,您可以(正如其他人建议的那样)这样做:

$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";
于 2009-10-09T09:14:46.283 回答