2013-02-21 6 views
10

Ich habe heute einen neugierigen Bug (nervt mich). Es gibt drei Vererbungs Ebenen beteiligt: ​​Unter welchen Umständen können Elternfelder nicht vererbt werden?

Opa:

abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess, 
                IteratorAggregate 
{ 
    protected $_data = array(); 

    /* snip */ 
} 

Mom:

namespace Survey\Db\Table\Row; 

class AbstractRow extends \Zend_Db_Table_Row_Abstract 
{ 
    /* snip */ 
} 

Kinder:

namespace Survey\Db\Table\Row; 

class SurveyItem extends AbstractRow implements ISkippable 
{ 
    /* snip */ 
} 

Ausnahme:

Type:  ErrorException 
Value: Undefined property: Survey\Db\Table\Row\SurveyItem::$_data 
Location: [...]/Zend/Db/Table/Row/Abstract.php in handleError , line 177 

Linie 177 scheint nicht relevant zu sein, aber ich hinzufüge es nur, damit Sie mir glauben würde;)

if (!array_key_exists($columnName, $this->_data)) { 

PHP 5.4.11 , Problem mit PHP hat keinen 5.4.8

existieren Als ich die fix für Bug #63462 Magic methods called twice for unset protected properties sah, dachte ich, dass wold löse das Problem, da dieser Bug genau zu dem seltsamen unerwarteten Ergebnis führt, das ich sah.

Aber es stellt sich heraus, das Problem existiert immer noch nach der Aktualisierung auf PHP 5.4.12. Die Wahrscheinlichkeit, dass es einen ähnlichen PHP-Fehler gibt, erscheint ziemlich hoch.

Frage:

bekomme ich die Info, dass ein geschütztes Feld in dem Opa definiert ist im Kind nicht definiert. Welche Szenarien können zu einem solchen Ergebnis führen?

+0

Können Sie der Referenz von '$ this -> _ data' etwas mehr Kontext hinzufügen. Schließen Sie die Klasse und die Methode ein, aus der sie referenziert wird. Der Code, wie Sie geschrieben haben, sieht aus wie Kind sollte Zugriff auf die Member-Var, ich frage mich, ob Sie Namespace AbstractRow bei der Erweiterung über SurveyItem benötigen. –

+0

Ich habe dies auf 5.3.20 versucht, mit leeren Klassen (die Eltern und Kind-Klassen abstrakt machen, so dass es kompiliert) und es ist alles in Ordnung.Versuchen Sie das auf Ihrer aktuellen PHP-Version, um sicherzustellen, dass es nicht etwas in Zend (vielleicht etwas PHP-Magie) ist, das in die Quere kommt? Wenn es jedoch an einer früheren Version 5.4 gearbeitet hat und sich sonst nichts geändert hat, dann muss es ein PHP-Bug sein. – halfer

+0

Es könnte etwas PHP 'Magie' sein. Ich versuche, die Frage zu verbessern, um Ihnen mehr Kontext zu geben. – markus

Antwort

1

folgende Snippet funktioniert einwandfrei auf 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(); 

Bitte minimieren Sie den Code Schritt für Schritt, dies zu sehen, ob/wann Problem auftritt (Ich frage mich, warum Sie es nicht bereits getan haben)

Wenn Sie sicher sind, diese auf PHP 5.4.8 gearbeitet und funktioniert nicht auf PHP 5.4.11 dann Sie einen Fehler in PHP gefunden und sollte es auf php.net

Antwort (vielleicht kann es anders sein berichten wurde einfach "unset" auf dem Weg). Minimieren Sie Ihren Code und Sie werden es wissen.

-1

Wenn das übergeordnete Feld nicht durch Objekte in der untergeordneten Klasse vererbt werden soll, deklarieren Sie das übergeordnete Feld als "statisch".

Verwandte Themen