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

Nov*_*der 8 php class instance invoke

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

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

class MyClass {
  public $attribute;
}

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

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

Ion*_*tan 24

$class = 'MyClass';
$instance = new $class;
Run Code Online (Sandbox Code Playgroud)

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

$class = new ReflectionClass('MyClass');
$args  = array('foo', 'bar');
$instance = $class->newInstanceArgs($args);
Run Code Online (Sandbox Code Playgroud)

还有ReflectionClass::newInstance,但它与上面的第一个选项完全相同.

参考:


Lar*_*röm 10

其他答案将在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);
Run Code Online (Sandbox Code Playgroud)


Tom*_*igh 6

如果构造函数所需的参数数量已知且不变,您可以(正如其他人所建议的那样)执行此操作:

$className = 'MyClass';
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World";
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以使用Reflection.这也意味着如果您不知道需要多少个,可以提供一组构造函数参数.

<?php
$rf = new ReflectionClass('MyClass');
$obj = $rf->newInstanceArgs($arrayOfArguments);
$obj->attribute = "Hello World";
Run Code Online (Sandbox Code Playgroud)