告诉PHP类在扩展时始终运行它的构造函数

Dav*_*ard 4 php constructor class extend

根据我的理解,当扩展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 }

    }


}
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉它在扩展时Options_Page_Template()总是运行它自己__constructor()?我知道我可以使用parent::__construct(),但这涉及将代码添加到扩展Class的所有文件中.

我也尝试了使用与Class相同名称的构造函数的老派方法,但PHP显然比它更聪明,因为它不起作用.谢谢.

Eve*_*ert 5

不可能.对于所有代码,一个好的经验法则是始终为覆盖构造函数的每个子类调用parent :: __构造; 如果你不是,那么在构造函数中显式注释,以及为什么.

一般来说,对于函数和con/destructors,如果你覆盖一些东西; 你还负责调用父函数.


Hug*_*ing 4

如果您在两个类中创建 __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();

?>
Run Code Online (Sandbox Code Playgroud)

输出:

Extended class before
construct class
Extended class after
Run Code Online (Sandbox Code Playgroud)