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シェルコードの最終メソッド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 に答える