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

时间:2013-02-21 21:46:30

标签: php inheritance

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

爷爷

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不存在问题

当我看到fix Bug #63462 Magic methods called twice for unset protected properties时,我想,这会解决问题,因为这个错误导致了我所看到的奇怪的意外结果。

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

问题:

我得到的信息是,在Child中未定义爷爷中定义的受保护字段。哪些情况可以导致这样的结果?

2 个答案:

答案 0 :(得分: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上报告

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

答案 1 :(得分:-1)

如果您不希望父字段通过对象在子类中继承,则将父字段声明为“static”。