PHP kurios

Ich habe kürzlich weiter an der Domain-Model-Umsetzung gearbeitet (nach Matthew Weier O’Phinney’s Tutorial). Nachdem das ganze vermeintlich gut beim Techtree funktioniert hatte, wagte ich mich nun an die Galaxiekomponente. Dabei stieß ich auf ein Problem dessen Lösung mich mehrere Stunden gekostet hat.

Es ist schon absurd lustig wenn man folgende Testausgaben macht und einem das Ergebnis wie Magie vorkommt – aber leider nicht weiterbringt:

$result  = $this->_resultSet[$key];
$gateway = $this->getGateway();
$result  = $gateway->createStellar($result);
Zend_Debug::dump("result before: ".get_class($result));
Zend_Debug::dump("_resultSet[$key] before:".get_class($this->_resultSet[$key]));
$this->_resultSet[$key] = $result;
Zend_Debug::dump("result after: ".get_class($result));
Zend_Debug::dump("_resultSet[$key] after:".get_class($this->_resultSet[$key]));
exit;

Kurze Erklärung: Ich lasse mir die Typen der 2 Object „$this->_resultSet[$key]“ und „$result“ ausgeben. Die Typen sind unterschiedlich. Dann setze ich sie gleich und lasse mir nochmal die Typen ausgeben. Die Typen beider Objekte sollten nun gleich sein – das sollte also folgende Ausgabe zur Folge haben:

result before:  Nouron_Galaxy_Stellar
_resultSet[$key] before:  Zend_Db_Table_Row_Abstract
result after:  Nouron_Galaxy_Stellar
_resultSet[$key] after:  Nouron_Galaxy_Stellar

Aber – und nun kommt die Magie – … ich erhielt die folgende Ausgabe:

result before:  Nouron_Galaxy_Stellar
_resultSet[$key] before:  Zend_Db_Table_Row_Abstract
result after:  Nouron_Galaxy_Stellar
_resultSet[$key] after:  Zend_Db_Table_Row_Abstract

Warum ist das nun so?
Ich hatte den Fehler gemacht und ein Zend_Db_Table_Rowset als Membervariable $this->_resultSet gespeichert. Das hat mit dem Array Access auch gut geklappt – allerdings bekommt man damit dann immer ein Zend_Db_Table_Row-Objekt zurück und wenn man per Array Access eine Row des Rowsets setzen will, wird dieses intern auch in ein Zend_Db_Table_Row-Objekt umgewandelt. (Das fiel mir beim Techtree nicht weiter auf, da beide Objekttypen Iteratorfunktionalität haben.)

$result = new Nouron_Galaxy_Stellar($data);
$this->_resultSet[$key] = $result; // setze Nouron_Galaxy_Stellar-Objekt
// $this->_resultSet[$key] ist NICHT vom Typ Nouron_Galaxy_Stellar,
// sondern wird intern zu Zend_Db_Table_Row umgewandelt

So ich hoffe ich konnte das Problem einigermaßen verständlich erklären.
Ich habe nun zur Lösung des Problems das Rowset in ein Array umgewandelt. Desweiteren fehlte der current()-Funktion noch eine Art „Abbruchbedingung“ – da ich immer in einer nervigen Endlosschleife beim durchiterieren der Objekte landete.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s