今天我有一个奇怪的错误(烦我)。涉及三个继承级别:
爷爷:
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中未定义爷爷中定义的受保护字段。哪些情况可以导致这样的结果?
答案 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”。