如何在类实例化中将数组作为构造函数参数传递?
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
。我的问题是如何将它们作为参数而不是数组发送?
答案 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);