2013-02-21 17 views
10

今日私は奇妙なバグ(私を悩ませている)を持っています。親フィールドは継承されない可能性がありますか?

おじいちゃん

abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess, 
                IteratorAggregate 
{ 
    protected $_data = array(); 

    /* snip */ 
} 

ママ

namespace Survey\Db\Table\Row; 

class AbstractRow extends \Zend_Db_Table_Row_Abstract 
{ 
    /* snip */ 
} 

子供:関与3つの継承のレベルがあります

namespace Survey\Db\Table\Row; 

class SurveyItem extends AbstractRow implements ISkippable 
{ 
    /* snip */ 
} 

例外

Type:  ErrorException 
Value: Undefined property: Survey\Db\Table\Row\SurveyItem::$_data 
Location: [...]/Zend/Db/Table/Row/Abstract.php in handleError , line 177 

ライン177が関連していないようですが、私はあなたが私を信じていると思いますので、それを追加している;)

if (!array_key_exists($columnName, $this->_data)) { 

PHP 5.4.11私はBug #63462 Magic methods called twice for unset protected propertiesためfixを見たとき、問題は、私は思った、そのウォールドPHP 5.4.8

に存在しませんでしたこのバグは私が見ていた奇妙な予期せぬ結果につながります。

しかし、PHP 5.4.12にアップデートした後で、の問題が解決されています。 PHPに別の類似のバグがある可能性は非常に高いようです。

質問:

私はおじいちゃんに定義されて保護されたフィールドは、子供に定義されていないという情報を得ます。そのような結果につながるシナリオは何ですか?スニペット以下

+0

'$ this - > _ data'の参照にもう少しコンテキストを追加できますか?それが参照されているクラスとメソッドを含めます。あなたが投稿したように、子供がメンバーvarにアクセスできるように見えるので、SurveyItem経由で拡張するときにAbstractRowを名前空間にする必要があるかどうか疑問に思っています。 –

+0

私はこれを5.3.20で試しました。空のクラスを使用しています(親クラスと子クラスを抽象にしてコンパイルしています)。あなたの現在のPHPバージョンでそれを試してください。途中でZend(PHPの魔法のようなもの)になっていないことを確認してください。しかしそれが以前のバージョン5.4で動作し、それ以外のものが変更されていない場合は、PHPのバグでなければなりません。 – halfer

+0

PHPの「魔法」になる可能性があります。私はより多くの文脈を与えるために質問を改善しようとしています。 – markus

答えて

1

PHP 5.4.9で問題なく動作します:

class A 
{ 
    protected $foo = 'hello'; 
    public function bar() 
    { 
     echo $this->foo; 
    } 
} 

class B extends A {} 

class C extends B {} 

$c = new C(); 
$c->bar(); 

/場合、問題が発生したときに表示するためにこれにステップして、コードのステップを最小限にしてください(あなたはすでにそれを行っていない理由を私は疑問に思う)

あなたは(多分それを、あなたはPHPのバグを発見し、

回答が異なる場合がありphp.netにそれを報告しなければならない、これはPHP 5.4.8に勤務し、PHP 5.4.11で動作しないことを確認している場合

道に沿って単に「アンセット」されている)。 コードを最小限に抑えれば分かります。

-1

親フィールドがオブジェクトを介して子クラスで継承されないようにするには、親フィールドを「静的」として宣言します。