在什么情况下父域可能不会被继承?

mar*_*kus 10 php inheritance

我今天有一个奇怪的错误(烦我).涉及三个继承级别:

爷爷:

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

    /* snip */
}
Run Code Online (Sandbox Code Playgroud)

妈妈:

namespace Survey\Db\Table\Row;

class AbstractRow extends \Zend_Db_Table_Row_Abstract
{
    /* snip */
}
Run Code Online (Sandbox Code Playgroud)

孩子:

namespace Survey\Db\Table\Row;

class SurveyItem extends AbstractRow implements ISkippable
{
    /* snip */
}
Run Code Online (Sandbox Code Playgroud)

例外:

Type:     ErrorException  
Value:    Undefined property: Survey\Db\Table\Row\SurveyItem::$_data  
Location: [...]/Zend/Db/Table/Row/Abstract.php in handleError , line 177  
Run Code Online (Sandbox Code Playgroud)

第177行似乎并不相关,但我添加它只是为了让你相信我;)

if (!array_key_exists($columnName, $this->_data)) {
Run Code Online (Sandbox Code Playgroud)

PHP 5.4.11,PHP 5.4.8中不存在问题

当我看到针对Bug#63462的魔法方法修复因为未设置的保护属性而被调用两次时,我想,这将解决问题,因为这个错误导致了我所看到的奇怪的意外结果.

但事实证明,更新到PHP 5.4.12之后问题仍然存在.PHP中存在另一个类似错误的可能性似乎很高.

题:

我得到的信息是,在Child中未定义爷爷中定义的受保护字段.什么情景可以导致这样的结果?

fsw*_*fsw 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();
Run Code Online (Sandbox Code Playgroud)

请逐步最小化您的代码,看看是否/何时出现问题(我想知道为什么您还没有这样做)

如果您确定这适用于 PHP 5.4.8 而不适用于 PHP 5.4.11,那么您发现了 PHP 中的错误,应该在 php.net 上报告它

答案可能会有所不同(也许它只是一路上“未设置”)。最小化你的代码,你就会知道。