2012-01-02 15 views
27

Magentoに_construct__constructメソッドがある理由はありますか?追加の_constructが存在するのはなぜですか?子クラスで親コンストラクタを呼び出すだけで、余分な_constructメソッドを実現できないことがありますか?私は見つけることができますMagentoに_constructメソッドと_constructメソッドがあるのはなぜですか?

+1

でこのについて詳しく読む: あなたは本当にBeneschのコードを使用する必要がありますか? – lonesomeday

+0

Magentoのほぼすべてのクラスが 'Varien_Object'クラスを拡張しています。そこに定義されているPHPの '__construct'があり、' _construct'が定義されています。 – Nick

答えて

63

ベストの答え: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を呼び出す前に、BaseClassdoSomethingReallyImportantが許可されます。

+1

これは、それが存在する正確な理由です。マゼンタの開発者は、Magentoのすべてが 'Varien_Object'を拡張しているので、' __construct'メソッドをオーバーライドしないでください。 これがまだ受け入れられていない理由はわかりません... – JMTyler

+1

これはすべてのクラスで当てはまるわけではありません。例えば、オブザーバーは_construct()メソッドを自動的に呼び出さない* *。 –

+0

Observersは、MagentoのVarien/Mageクラスを拡張する予定はない(または少なくとも必須ではない)レアクラスです。基本Varienクラスを拡張していない場合、_construct()を呼び出すVarienの動作は発生しません。 – STW

3

編集:ご迷惑をおかけしますがご了承ください。_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(); 
    } 
} 
+0

これは正解でなければなりません... –

+1

編集は本当に重要で、あまりにも抑圧されています。私はこの答えをほとんど落とした。 – kojiro

+0

しかし、時にはプログラマーのスキルを信用していないというのは不幸です... – zie1ony

4

:あなたが好き、手動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"; 
    } 
} 

Magento Block Lifecycle Methods by Alan Storm

関連する問題