据我所知,当PHP类被扩展时,它的构造函数不会被调用吗?因此,在下面的代码中,Options_Page_Template->on_enqueue_scripts()方法从未实际运行过-
class Options_Page_Template{
function __construct(){
/** Enqueue scrips and styles for use in this plugin */
add_action('wp_enqueue_scripts', array(&$this, 'on_enqueue_scripts'));
}
function on_enqueue_scripts(){
{ do Whatever here }
}
}
class Options_Home extends Options_Page_Template{
function __construct(){
{ Add various actions here }
}
}有没有一种方法可以告诉Options_Page_Template()在扩展时始终运行自己的__constructor()?我知道我可以使用parent::__construct(),但这涉及到将代码添加到扩展类的所有文件中。
我也尝试了老式的方法,将构造函数命名为与类相同的名称,但PHP显然比这更聪明,因为它不起作用。谢谢。
发布于 2013-01-02 19:25:37
如果要在这两个类中创建__construct,则必须始终使用parent::__construct()。您可以让您的父类构造函数检查子类中是否存在自定义构造函数,并运行它。
<?php
class Options_Page_Template{
function __construct(){
if (method_exists($this,'__beforeconstruct'))
$this->__beforeconstruct();
echo "construct class<br/>";
if (method_exists($this,'__afterconstruct'))
$this->__afterconstruct();
}
function on_enqueue_scripts(){
}
}
class Options_Home extends Options_Page_Template{
function __beforeconstruct(){
echo "Extended class before<br/>";
}
function __afterconstruct(){
echo "Extended class after<br/>";
}
}
new Options_Home();
?>输出:
Extended class before
construct class
Extended class after发布于 2013-01-02 19:17:46
这不可能。对你所有的代码来说,一个很好的经验法则是,总是为覆盖构造函数的每个子类调用parent::__construct;如果没有,则在构造函数中显式注释,并说明原因。
通常,对于函数和con/destructor,如果您重写了某些内容,您还需要负责调用父函数。
发布于 2013-01-02 19:22:04
你可以做一些令人讨厌的事情,比如将你的构造函数定义为final,并有一个受保护的init方法,扩展类可以覆盖它,但老实说,我并不推荐这样做。
这样,如果有人试图在子类中编写构造函数,他们会得到如下内容:
PHP致命错误:无法在php shell代码的第5行重写最终方法A::__construct()
你可能需要考虑一种不同的方法来组织你的课程。
https://stackoverflow.com/questions/14121058
复制相似问题