如何“调用”在PHP中的类的实例?(How to “invoke” a class instance

2019-07-21 16:39发布

是否有可能由一个字符串表示“调用”一个类的实例?

在这种情况下,我会想到的代码如下所示:

class MyClass {
  public $attribute;
}

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

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

Answer 1:

$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()


Answer 2:

其他答案将在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);


Answer 3:

如果通过构造函数需要的参数个数是已知的,恒定的,你可以(如其他人所说)做到这一点:

$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";


文章来源: How to “invoke” a class instance in PHP?