将数组作为类构造函数的函数参数传递

时间:2014-09-12 15:44:53

标签: php oop

如何在类实例化中将数组作为构造函数参数传递?

abstract class Person {

    protected function __construct(){

    }

    public static final function __callStatic($name, $arguments){
        return new $name($arguments);
    }

}

class Mike extends Person {

    protected function __construct($age, $hobby){
        echo get_called_class().' is '.$age.' years old and likes '.$hobby;
    }
}


// =============================================

Person::Mike(15, 'golf');

这应输出

  迈克15岁,喜欢高尔夫

但我在Mike的构造函数中缺少第二个参数,因为来自__callStatic的两个参数都作为数组发送到$age。我的问题是如何将它们作为参数而不是数组发送?

3 个答案:

答案 0 :(得分:2)

您可以使用Reflection

public static function __callStatic($name, $arguments){
    $reflector = new ReflectionClass($name);
    return $reflector->newInstanceArgs($arguments);
}

答案 1 :(得分:1)

使用call_user_func_array()http://fi1.php.net/manual/en/function.call-user-func-array.php和工厂方法:

class Mike extends Person {

    public static function instantiate($age, $hobby) {
        return new self($age, $hobby);
    }
    protected function __construct($age, $hobby){
        echo get_called_class().' is '.$age.' years old and likes '.$hobby;
    }
}

然后像这样做一个迈克:

abstract class Person {

    protected function __construct(){

    }

    public static final function __callStatic($name, $arguments){
        return call_user_func_array(array($name, 'instantiate'), $args);
    }

}

答案 2 :(得分:0)

您正在使用静态范围解析器错误

Person::Mike(15, 'golf');

这意味着您在班级Mike中有一个静态方法Person,而您正在静态调用它。

相反,您想要实例化Mike

$mike = new Mike(15, 'golf');

如果您想从Person调用静态内容,因为Mike扩展了它,Mike也可以静态调用它。

Mike::staticMethod($args);