我有这段代码:
class A {
var $arr = array();
function __construct($para) {
echo 'Not called';
}
}
class B extends A {
function __construct() {
$arr[] = 'new Item';
}
}
因为B有自己的构造函数构造($ para),所以A永远不会被调用。
现在我可以调用parent :: __ construct($ para),但是B类需要知道A类需要的参数。
我更喜欢这个:
class A {
var $arr = array();
function __construct($para) {
echo 'Not called';
}
}
class B extends A {
function __construct() {
parent::__construct(); // With the parameters class B was created.
// Additional actions that do not need direct access to the parameters
$arr[] = 'new Item';
}
}
这样的事情会起作用吗?
我不喜欢这样的事实:扩展A类的所有类都需要定义一个新的构造函数,一旦A类更改了它的参数,我想让它们做的就是调用类A的构造函数,就像类一样B不会使用自己的__construct()方法覆盖它。
答案 0 :(得分:6)
通过使用call_user_func_array()
和func_get_args()
函数,有一种方法可以像您最初描述的那样完成此操作:
class B extends A {
function __construct() {
// call the parent constructor with whatever parameters were provided
call_user_func_array(array('parent', '__construct'), func_get_args());
// Additional actions that do not need direct access to the parameters
$arr[] = 'new Item';
}
}
虽然这是一个有趣的练习,但我个人不建议实际使用它 - 我认为使用单独的init()
方法是一个更好的设计。
答案 1 :(得分:4)
一种解决方案是首先不要覆盖父构造函数。相反,定义父构造函数自动调用的单独(最初为空)init()
方法。然后可以在子进程中覆盖该方法以执行额外处理。
class A {
public function __construct($para) {
// parent processing using $para values
// ..and then run any extra child initialization
$this->init();
}
protected function init() {
}
}
class B extends A {
protected function init() {
// Additional actions that do not need direct access to the parameters
}
}