今天有一个奇怪的错误(bug我).有三个继承层面涉及:
爷爷:
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)) {
当我看到Bug #63462 Magic methods called twice for unset protected properties Bug #63462 Magic methods called twice for unset protected properties时,我想,这个问题解决了这个问题,因为这个bug导致了我看到的奇怪的意想不到的结果.
但事实证明,更新到PHP 5.4.12后仍然存在问题.在PHP中有一个类似错误的可能性似乎相当高.
题:
我获得了在爷爷中定义的保护字段在孩子中未定义的信息.什么情况可以导致这样的结果?
以下片段在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上报告
答案可能会有所不同(或许这样做简直就是“不了”).尽可能减少你的代码,你会知道.