0

initの使用方法について質問があります。複数の子クラスを持つ親クラスがあり、それらすべてのinit関数内に同じコンテンツがある場合、そのコンテンツを親initクラスに配置してから、次のようにするのが最適です。

public function init(){
    parent::init();
}

これは論理的に見えるかもしれませんが、残念ながらzend固有である私が読んだすべての場所で、複雑さを避けるために親クラスのinitメソッドを空のままにしておくと言われています。

誰かが明確にしてくれませんか?

4

4 に答える 4

2

表示されるのは、コーディング方法の違いだけだと思います。

すべての子クラスがまったく同じinit()メソッドを持っている場合、子クラス内でメソッドを宣言する理由すらありません。

ただし、場合によっては、開発者があなたが示したとおりに実行するのを見てきました。多くの場合、これは、最終的な意図が、クラスに固有の方法で親メソッドの動作を何らかの形で拡張することである可能性があるためです。他のケースでは、子クラスのコレクションが機能をオーバーライドするのを見たことがあります。そのため、開発者はすべての子クラスにこのようなメソッドを配置して、他の開発者が意図(この子クラスの場合と同じように親メソッドを実行する)を明確にします。

于 2012-11-21T22:25:18.607 に答える
0

多くのZendクラスにはinit()、コンストラクターの最後にそれらの関数を呼び出すコンストラクターがあります。アイデア(私は推測します)は、それらから継承するクラスが呼び出しを回避できるということです

public function __construct(){
    parent::__construct();

    //child class logic
}

IMOこれは不必要な便利さです。

とにかく、サブクラスで呼び出したい唯一の理由はparent::init()、それが実際にZendの孫クラスであり、その親にもロジックが含まれている場合init()です。そのような場合、空の関数はその親を呼び出すか、完全に削除する必要があります。

于 2012-11-21T22:29:23.197 に答える
0

待って、何?親クラスにinitメソッドが必要で、子にまったく同じメソッドが必要な場合は、それを親クラスに追加するだけで、子は自動的に継承するため、子には何もしません。

これ:

public function init(){
    parent::init();
}

次のように書く方がはるかに良いです:

 

(はい、それは何もありません。メソッドが行うのが親メソッドを呼び出すことだけである場合は、それを省略してください。)

于 2012-11-21T22:19:08.897 に答える
0

子クラスが親クラスを拡張し、親のメソッドをオーバーライドしない場合、子クラスは単に親メソッドを継承します。Zendはそれとは何の関係もありません。

class A {
   function foo() {
     echo "foo";
   }
}

class B extends A {}

$b = new B();

$b->foo();

出力は

foo

また、魔法の方法initではありません。そのままの方法です。Zendで使用されているという事実は、その設計に由来しています。名前を付けることもできます(ただし、もちろん、ZF内でこの方法を使用する場合よりも適切な選択です)。fooinitializefooinitfoo

于 2012-11-21T22:20:53.773 に答える