10

今日は奇妙なバグがあります (私を悩ませています)。関連する継承レベルは 3 つあります。

おじいちゃん

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 */
}

子供:

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、PHP 5.4.8 では問題はありませんでした

バグ #63462 マジック メソッドが unset protected properties に対して 2 回呼び出されるの修正を見たとき、これで問題が解決すると思いました。

しかし、PHP 5.4.12 に更新した後も問題が解決しないことが判明しました。PHP に別の同様のバグがある可能性は非常に高いようです。

質問:

おじいちゃんで定義された保護されたフィールドが子で未定義であるという情報を取得します。そのような結果につながる可能性のあるシナリオは何ですか?

4

2 に答える 2

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 5.4.8 では機能し、PHP 5.4.11 では機能しないことが確実な場合は、PHP にバグが見つかったので、php.net で報告する必要があります。

答えは異なる場合があります(途中で「設定解除」された可能性があります)。コードを最小限に抑えるとわかります。

于 2013-02-21T23:05:25.623 に答える
-1

オブジェクトを介して親フィールドを子クラスに継承させたくない場合は、親フィールドを「静的」として宣言します。

于 2013-03-24T14:08:06.347 に答える