PHP在创建新对象时传递参数,对象调用call_user_func_array

Pat*_*ick 22 php

我想动态创建一个PHP对象,参数是可选的.

例如,而不是这样做:

$test = new Obj($param);
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情(创建新的ob是虚构的):

$test = create_new_obj('Obj', $param);
Run Code Online (Sandbox Code Playgroud)

php中有这样的功能吗?类似于call_user_func_array的东西,但代替对象.

小智 25

从PHP 5.6开始,您现在可以使用新的Argument Unpacking运算符(...)通过一行代码实现此目的.

这是一个简单的例子.

$className='Foo';
$args=['arg1','arg2','arg3'];

$newClassInstance=new $className(...$args);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅PHP可变长度参数列表.


goa*_*oat 16

由于某些构造函数可能采用可变数量的参数,因此应使用以下方法来适应它.

$r = new ReflectionClass($strClassName);
$myInstance = $r->newInstanceArgs($arrayOfConstructorArgs);
Run Code Online (Sandbox Code Playgroud)

例如,如果你的Car构造函数采用了3个args

$carObj = new Car($color, $engine, $wheels);
Run Code Online (Sandbox Code Playgroud)

然后

$strClassName = 'Car';
$arrayOfConstructorArgs = array($color, $engine, $wheels);
$r = new ReflectionClass($strClassName);
$carObj = $r->newInstanceArgs($arrayOfConstructorArgs);
Run Code Online (Sandbox Code Playgroud)

http://php.net/manual/en/class.reflectionclass.php
http://php.net/manual/en/reflectionclass.newinstanceargs.php

  • 在我的测试中,使用php中的反射并不比func\_get\_ _ _ _ =()慢.另外,您无需更改类的代码. (4认同)

小智 7

在这种情况下,我使用工厂方法.它们可以在抽象类中轻松定义:

class Foobar {

    public function __construct($foo, $bar) 
    {
        // do something
    }

    static public function factory($foo, $bar) 
    {
        return new self($foo, $bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

有了它你可以使用call_user_func_array():

$my_foobar_obj = call_user_func_array('Foobar::factory', array($foo, $bar));
Run Code Online (Sandbox Code Playgroud)


zom*_*bat 6

只要知道类名,就可以动态创建对象:

$objName = 'myClass';
$test = new $objName($param);
Run Code Online (Sandbox Code Playgroud)

如果这是构造逻辑的要求,您可以轻松定义一个__construct()函数来获取默认参数.

[编辑注释]:这是一个称为变量变量的概念,手册中有一些引入命令的例子.