Magentoに_construct
と__construct
メソッドがある理由はありますか?追加の_construct
が存在するのはなぜですか?子クラスで親コンストラクタを呼び出すだけで、余分な_construct
メソッドを実現できないことがありますか?私は見つけることができますMagentoに_constructメソッドと_constructメソッドがあるのはなぜですか?
答えて
ベストの答え:http://www.magentocommerce.com/boards/viewthread/76027/#t282659
は基本的には、(他のすべてのクラスが継承する)ルートレベルのクラスは、クラスが構築されるたびにPHPが自動的に呼び出す、__construct
を実装しています。現在のところ、このルートレベルのクラスは単に実際のコードを含む_construct
を呼び出します。
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
doSomethingReallyImportant();
}
}
class SubClass extends BaseClass {
function __construct() {
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
//"In BaseClass constructor"
//something really important happens
$obj = new SubClass();
//"In SubClass constructor"
//important thing DOESN'T happen
PHPは自動的に親クラスのコンストラクタを呼び出すことはありませんので、doSomethingReallyImportant
が呼ばれることは決してありません:
は、このセットアップを持っていると言います。あなたはサブクラスのコンストラクタがparent::__construct()
を呼び出すことを要求することができますが、それは忘れやすいです。だから、Magentoのは、サブクラスが_construct
を無効にしている:それはBaseClass
のコンストラクタを呼び出すよう
class BaseClass {
function __construct() {
doSomethingReallyImportant();
_construct();
}
function _construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function _construct() {
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
//something really important happens
//"In BaseClass constructor"
$obj = new SubClass();
//something really important happens
//"In SubClass constructor"
をPHPは、でコンストラクタを検出しません。これにより、サブクラスのオーバーライドされた_construct
を呼び出す前に、BaseClass
〜doSomethingReallyImportant
が許可されます。
これは、それが存在する正確な理由です。マゼンタの開発者は、Magentoのすべてが 'Varien_Object'を拡張しているので、' __construct'メソッドをオーバーライドしないでください。 これがまだ受け入れられていない理由はわかりません... – JMTyler
これはすべてのクラスで当てはまるわけではありません。例えば、オブザーバーは_construct()メソッドを自動的に呼び出さない* *。 –
Observersは、MagentoのVarien/Mageクラスを拡張する予定はない(または少なくとも必須ではない)レアクラスです。基本Varienクラスを拡張していない場合、_construct()を呼び出すVarienの動作は発生しません。 – STW
編集:ご迷惑をおかけしますがご了承ください。_construct
と__construct
の違いは間違っています。 Magentoのプログラマは、自分のコンストラクタがもはや呼び出されないというリスクなしに、コンストラクタをオーバーライドすることを簡単にするように努力してきたと思います。 Varien_Objectの_constructメソッドは空ですので、サブクラスから呼び出されないかどうかは関係ありません。
これは、PHPがクラスのコンストラクタとデストラクタを実装する方法です。それに特有のMagentoはありません。
他の言語では、コンストラクタは通常、クラス自体と同じ名前を持つメソッドで実装され、コンストラクタは通常、メソッド名の前にティルダ(〜)を持ち、クラスと同じ名前を持ちます。 PHPは何らかの理由でこの方法で実装していますが、PHPもクラス名(link)のコンストラクタとデストラクタをサポートしているようです。
クラスは、特に別のクラスをサブクラス化するときに、コンストラクタやデストラクタを持つ必要はありません。マルコへ
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
// Your code
}
function __destruct() {
// Your code
parent::__destruct();
}
}
:あなたが好き、手動parent::
上でそれを呼び出すことでオーバーライドされたクラスのコンストラクタまたはデストラクタを呼び出す必要があり、その後、コンストラクタやデストラクタを上書き行う場合には、このような__construct()
メソッドをオーバーライドすることが間違っていますMagento。理由がある - すべてのクラスがVarien_Object
からそれを継承し、それはこのコードを持っている:
#File: lib/Varien/Object.php
public function __construct()
{
//...snip...
$args = func_get_args();
if (empty($args[0]))
{
$args[0] = array();
}
//...snip...
}
//...
__constructであなたのコードを使用して、これらの引数は通過されません。あなたはこの例を示すことができ
class SubClass extends BaseClass {
function _construct() {
print "In SubClass constructor\n";
}
}
- 1. PHPの_construct(メソッド)と__construct(予約メソッド)
- 2. Magentoブロック構造体 - _constructまたは__constructを使用しますか?
- 3. _construct(Cではoopプロジェクトで使用されるマクロ)
- 4. Thorにno_tasksメソッドがあるのはなぜですか?
- 5. notifyメソッドがsynchronizedブロック内にあるのはなぜですか?
- 6. どこでもPOSTメソッドがあるのはなぜですか?
- 7. メソッドにパラメータがないのに、静的メソッドStream.empty()に仮パラメータタイプがあるのはなぜですか?
- 8. なぜC#のHashSetにDistinct()メソッドがあるのですか
- 9. 受信がメソッドと呼ばれるのはなぜですか?
- 10. セットには別のequalsメソッドがあるのはなぜですか?
- 11. ClassInitializeメソッドを静的にする必要があるのはなぜですか?
- 12. なぜPerl 6のunwrapメソッドがルーチンのメソッドですか?
- 13. javascriptがメソッド内でメソッドを実行できないのはなぜですか?
- 14. JPA TransientアノテーションのメソッドがTargetにあるのはなぜですか?
- 15. Javaドキュメントのインタフェースページにメソッド要約があるのはなぜですか?
- 16. loadClassメソッドでfindLoadedClassメソッド呼び出しが必要なのはなぜですか?
- 17. なぜRubyのメソッドへの参照は ``メソッド `"ではなく ``メソッド '"と書かれていますか?
- 18. スタティックライブラリにinitメソッドを持つクラスがあるのはなぜですか?
- 19. Silverlightのシステムオブジェクトにメソッドがないのはなぜですか?
- 20. Enumerableのメソッドがメソッド本体を持たないのはなぜですか?
- 21. CustomFieldSerializerに静的メソッドが必要なのはなぜですか?
- 22. dictにremoveメソッドがないのはなぜですか?
- 23. Stream APIにflatten()メソッドがないのはなぜですか?
- 24. メソッドに戻り値が必要なのはなぜですか?
- 25. NSSetにwriteToFileメソッドがないのはなぜですか?
- 26. Windows UniversalアプリケーションにXmlNode.SelectSingleNodeメソッドがないのはなぜですか?
- 27. Django ValuesListQuerySetにappend()メソッドがないのはなぜですか?
- 28. SerializationInfoにTryGetValueメソッドがないのはなぜですか?
- 29. C#Linq Count()メソッドにIReadOnlyCollectionがないのはなぜですか?
- 30. RxJavaに `Single#doOnTerminate`メソッドがないのはなぜですか?
でこのについて詳しく読む: あなたは本当にBeneschのコードを使用する必要がありますか? – lonesomeday
Magentoのほぼすべてのクラスが 'Varien_Object'クラスを拡張しています。そこに定義されているPHPの '__construct'があり、' _construct'が定義されています。 – Nick