如何将构造函数作为回调传递

时间:2017-09-05 15:37:08

标签: php

我试图使用array_map将数组映射到我的类的实际实例。

class Pet {

    private $petName;

    public function __construct($args) {
        $this->petName = $args['petName'];
    }

}

$array = [['petName' => 'puppy'], ['petName' => 'kitty']];

$instances = array_map([Pet::class, '__construct'], $array);

然而它以错误结束: non-static method Pet::__construct() cannot be called statically

是否可以将构造函数调用作为回调传递(除了在闭包中包装它)?

2 个答案:

答案 0 :(得分:9)

因为它不是创建类实例的构造函数;构造函数只是类中的一个代码块,当使用new创建类实例时,它会被神奇地调用;所以你所做的就是试图静态地调用类的非静态方法,这就是问题所在。

$instances = array_map(function($args) { return new Pet($args); }, $array);

是唯一可行的方法

答案 1 :(得分:5)

构造函数不是直接调用的,new运算符会以特殊方式调用它们。

所以提供一个使用new的函数。

public static function makePet($args) {
    return new Pet($args);
}

然后使用

$instances = array_map([Pet::class, 'makePet'], $array);