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

孩子

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

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

但事实证明,更新到 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 回答