今日私は奇妙なバグ(私を悩ませている)を持っています。親フィールドは継承されない可能性がありますか?
おじいちゃん:
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 */
}
子供:関与3つの継承のレベルがあります
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私はBug #63462 Magic methods called twice for unset protected propertiesためfixを見たとき、問題は、私は思った、そのウォールドPHP 5.4.8
に存在しませんでしたこのバグは私が見ていた奇妙な予期せぬ結果につながります。
しかし、PHP 5.4.12にアップデートした後で、の問題が解決されています。 PHPに別の類似のバグがある可能性は非常に高いようです。
質問:
私はおじいちゃんに定義されて保護されたフィールドは、子供に定義されていないという情報を得ます。そのような結果につながるシナリオは何ですか?スニペット以下
'$ this - > _ data'の参照にもう少しコンテキストを追加できますか?それが参照されているクラスとメソッドを含めます。あなたが投稿したように、子供がメンバーvarにアクセスできるように見えるので、SurveyItem経由で拡張するときにAbstractRowを名前空間にする必要があるかどうか疑問に思っています。 –
私はこれを5.3.20で試しました。空のクラスを使用しています(親クラスと子クラスを抽象にしてコンパイルしています)。あなたの現在のPHPバージョンでそれを試してください。途中でZend(PHPの魔法のようなもの)になっていないことを確認してください。しかしそれが以前のバージョン5.4で動作し、それ以外のものが変更されていない場合は、PHPのバグでなければなりません。 – halfer
PHPの「魔法」になる可能性があります。私はより多くの文脈を与えるために質問を改善しようとしています。 – markus