Eigenschaften von Objekten verschwinden
MichaelR
- php
Hallo zusammen,
ich hab folgendes Problem (vereinfacht):
ein Array verwaltet verschiedene Objekte des Typs "ApplicationPage"; jedes dieser Objekte hat verschiedene Eigenschaften, die zur Laufzeit gesetzt werden.
EInige dieser Eigenschaften werden beim Erzeugen des Objekts vordefiniert. An einer bestimmten Stelle im PHP-Script lasse ich mir ein bestimmtes ApplicationPage Objekt per Referenz zurückgeben (& an allen Stellen vorhanden, wo man es bei der Referenz-Nutzung haben muss).
$TempObj = & ElternObjekt->GetKind(Id);
Dann werden verschiedene Eigenschaften ergänzt. An einer anderen Stelle im Skript wird auf dieses Objekt wieder zurückgegriffen und u.a. eine HTML-Seite erstellt.
Das Problem:
Auf meinem lokalen PHP-Server mit Version 5.2.10 funktioniert dieses einwandfrei. Auf einem anderen Webserver mit der Version 5.2.6 gehen die Eigenschaften des Elternobjekts verloren, die ich mit obigen Code zur Laufzeit ergänze. Die sind bei Gebrauch einfach nicht mehr im Objekt vorhanden.
Hat jemand vielleicht eine Idee woran das liegen könnte???
Danke + Grüße
Michael
Hi,
Auf meinem lokalen PHP-Server mit Version 5.2.10 funktioniert dieses einwandfrei. Auf einem anderen Webserver mit der Version 5.2.6 gehen die Eigenschaften des Elternobjekts verloren, die ich mit obigen Code zur Laufzeit ergänze. Die sind bei Gebrauch einfach nicht mehr im Objekt vorhanden.
Dann würde ich als erstes mal die Changelogs von PHP konsultieren, was sich zwischen diesen Versionen verändert haben könnte, das für's Objekthandling wesentlich ist.
Dass das error_reporting auf E_ALL (oder besser noch E_ALL&E_STRICT) steht sowie display_errors auf on, darf wohl vorausgesetzt werden(?).
MfG ChrisB
Hi,
Dann würde ich als erstes mal die Changelogs von PHP konsultieren, was sich zwischen diesen Versionen verändert haben könnte, das für's Objekthandling wesentlich ist.
Bin ich grad dabei ... aber kann sich bei dem Objekthandling sowas gravierendes verändert haben, dass solche Fehler auftreten können? Sehr strange ... :-(
Dass das error_reporting auf E_ALL (oder besser noch E_ALL&E_STRICT) steht sowie display_errors auf on, darf wohl vorausgesetzt werden(?).
Ja, es werden absolute keine Fehler angezeigt ...
Grüße
Michael
Hi,
Dann würde ich als erstes mal die Changelogs von PHP konsultieren, was sich zwischen diesen Versionen verändert haben könnte, das für's Objekthandling wesentlich ist.
Bin ich grad dabei ...
Wenn sich dabei nichts ergibt, und das Phänomen ansonsten wirklich stumm (ohne Meldungen) vor sich geht - dann vielleicht auch noch mal im Bugtracker schauen, ob da seit Version 5.2.10 was in der Richtung gemeldet wurde.
MfG ChrisB
Hi nochmals,
jetzt ist mir noch was anderes eingefallen, vielleicht liegsts daran.
Wenn ich in der ELternklasse eine private Eigenschaft habe, die ich in der Elternklasse mit Daten fülle, muss ich diese Klasse in der Kindklasse dann nochmals deklarieren, um den Inhalt zu behalten? Nicht, oder?
Das folgende Beispiel funktioniert z. B. bei dem Problem-Server auch nicht:
class ObjA{
private $Eig = "";
public function SetEig($str){$this->Eig = $str;}
}
class ObjB extends ObjA {
public function Set($str1){$this->SetEig($str1);}
public function DoPrint(){print $this->Eig;}
}
$var = new ObjB();
$var->Set("Hallo");
$var->DoPrint();
Hier wird nämlich nichts angezeigt am Bildschirm???
Sehr komisch ...
Grüße
Michael
Hi,
Da ist noch ein Fehler drinnen, jetzt gehts .... auch wenn mein eigentliches Hauptproblem (siehe erster Post) noch immer nicht gelöst ist :-(
class ObjA{
private $Eig = "";
public function SetEig($str){$this->Eig = $str;}
public function GetEig(){return $this->Eig;}
}
class ObjB extends ObjA {
public function Set($str1){$this->SetEig($str1);}
public function DoPrint(){print $this->GetEig();}
}
$var = new ObjB();
$var->Set("Hallo");
$var->DoPrint();
»»
>
> Grüße
> Michael
Hi,
Wenn ich in der ELternklasse eine private Eigenschaft habe, die ich in der Elternklasse mit Daten fülle, muss ich diese Klasse in der Kindklasse dann nochmals deklarieren, um den Inhalt zu behalten?
http://www.php.net/manual/en/language.oop5.visibility.php besagt schon mal,
Members declared as private may only be accessed by the class that defines the member.
Da in der vorhergehenden Beschreibung von protected noch explizit von den abgeleiteten Klassen, hier aber nicht, bedeutet das zumindest schon mal, dass du in einer Nachfahrenklasse keinen Zugriff auf diese Eigenschaft des Parents hast.
Davon abgesehen verstehe ich aber auch nicht, was genau du mit ”in der Elternklasse mit Daten füllen meinst”.
Meinst du, dass du eine konkrete Instanz der Elternklasse dafür nutzt? Dann wäre eine Kindklasse, in der du nachher darauf zugreifen willst, ja aber sicher nicht die selbe Instanz.
Oder redest du vom Aufruf statischer Methoden?
MfG ChrisB
Hi,
hab das Problem gefunden:
in der Verwalterklasse lasse ich mir die Kindklasse auf eine lokale Variable zurückgeben. Dann wurden die Eigenschaften dieser Klasse über die Variable verändert. Das Problem war jetzt, dass in PHP 5.2.6 die Variable eine Kopie des Objekts war während in dPHP 2.6.10 die Referenz zurückgegeben wurde.
Grüße
Michael
Hi!
An einer bestimmten Stelle im PHP-Script lasse ich mir ein bestimmtes ApplicationPage Objekt per Referenz zurückgeben (& an allen Stellen vorhanden, wo man es bei der Referenz-Nutzung haben muss).
$TempObj = & ElternObjekt->GetKind(Id);
Das ist schonmal unnötig. Seit PHP5 werden Objekte immer als Referenz übergeben. Kopien muss man explizit mit clone anfertigen. (Alle anderen Variablentypen werden nach wie vor als Kopie übergeben.)
Lo!