4

据我了解,当扩展 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 显然比这更聪明,因为它不起作用。谢谢。

4

5 回答 5

5

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

一般来说,对于函数和构造函数/析构函数,如果你重写了一些东西;您还负责调用父函数。

于 2013-01-02T11:17:45.740 回答
3

parent::__construct()如果要在两个类中创建 __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-02T11:25:37.180 回答
2

你可以做一些讨厌的事情,比如将你的构造函数定义为 final 并有一个受保护的 init 方法,扩展类可以覆盖它,但老实说我不建议这样做。

这样,如果有人试图在子类中编写构造函数,他们会得到类似的东西:

PHP 致命错误:无法在第 5 行的 php shell 代码中覆盖最终方法 A::__construct()

您可能需要换一种不同的方法来组织您的课程。

于 2013-01-02T11:22:03.750 回答
0
class Options_Home extends Options_Page_Template{

    function __construct() { 
       parent::__construct(); // Needs to be first line so the rest of the constructor
                              // can assume the Options_Page_Template has been constructed.
       // Various stuff here for Options_home constructor

    }


}

应该管用。

于 2013-01-02T11:23:11.173 回答
-2

只是不要为扩展类定义构造函数。

于 2013-01-02T11:17:38.820 回答