php - 什么情况下可能不继承父字段?

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

child :

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, problem did NOT exist with PHP 5.4.8

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

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

问题:

我得到的信息是,在祖父中定义的 protected 字段在子项中未定义。什么情况会导致这样的结果?

最佳答案

以下代码片段在 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 上报告它

答案可能不同(也许它只是在过程中“未设置”)。 最小化您的代码,您就会知道。

关于php - 什么情况下可能不继承父字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012847/

相关文章:

javascript - 警报(消息)返回空字符串

php - 如何覆盖内置的 PHP 函数?

java - 为什么继承输出是意外的

c++ - 隐式复制构造函数和继承

C++ : sharing fields between class and superclasses

PHP Codeigniter : set Port Number for MySQL Configuration

php - 通过另一个数组对数组进行分组?

c# - 正确使用 C# 'new' 修饰符使 protected 属性公开

c++ - 从具有多重继承的派生类调用所有基类的公共(public)命名方法

php - Doctrine "group by"不返回所有现有对象