相当直截了当的问题。在C ++中,父构造函数将在子构造函数之前被隐式调用,那么PHP有什么逻辑不以这种方式做事?
编辑:我从Lukman得到了一个很好的答案,但我希望有更多的原因可以解决这个问题。也许问题应该是为什么C ++不允许自定义调用父构造函数?我猜这是另一个问题。
答案 0 :(得分:25)
我认为PHP让你手动调用父的构造函数是件好事,因为它允许子的构造函数如下:
public function __construct() {
// set up variables that parent::__construct() requires
$var1 = get_stuff_from_db();
$var2 = get_stuff_from_webservice();
parent::__construct($var1, $var2);
// continue setting up $this var
$this->default = 'Default';
$this->do_some_secret_stuff();
}
甚至:
public function __construct($param) {
// call differently based on condition
if (is_array($param))
$param['id'] = 0;
parent::__construct($param);
}
else {
parent::__construct($param, 0, TRUE);
}
// continue setting up $this var
$this->default = 'Default';
$this->do_some_secret_stuff();
}
意思是,您可以自由地在子项内的任何位置调用父构造函数,并且您可以在调用之前和之后自由地执行操作。这不是一个功能吗?
答案 1 :(得分:8)
如果子类中没有构造函数,则会自动调用父类。
如果您决定向子类添加构造函数,那么您当然需要显式调用父构造函数。如果您已经花时间在子类中添加构造函数,那么再添加一行代码parent::__construct();
似乎不是什么大问题。但最重要的是实际上是一种方便的灵活性。
答案 2 :(得分:1)
避免紧密耦合这就是为什么继承(在java中扩展关键字)是邪恶的并且接口类是首选的,请参阅Javaworld文章: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html
如果有一些指令在某个时刻使用特殊关键字(例如forward)调用父级,但我还没有看到任何语言(甚至是Rebol),除非是Paul Allen发明的一种未知语言,是的,微软的联合创始人,即Openscript。