Mailinglisten-Archive |
LB BL wrote: > hallo! > > folgendes problem hab ich seit umstellung auf php5 (meine ich zumindest, dass es erst seit dem zeitpunkt auftritt): > > class k1 > { > function k1(p1,p2){} > } > > class k2 extends k1 > { > function k2(p1,p2) > { $this->k1(p1,p2); > //alternativ: parent::k1(p1,p2) > } > } > > bisher nahm ich an, dass der konstruktor der oberklasse unter php nicht automatisch aufgerufen wird. aber selbst wenn dem so ist, möchte ich dies selbst bewerkstelligen, da ich ja parameter weiterreichen will. > das problem das jetzt auftritt ist, dass der konstruktor der oberklasse 2x aufgerufen wird, einmal implizit durch php u. das zweite mal durch meinen expliziten aufruf. > das ist mir jetzt aufgefallen, da ich einen destructor in der oberklasse habe, der nun zweimal aufgerufen, da dieser destructor automatisch jeden konstruktor-aufruf als objekt-erzeugung versteht. heisst - es wird nachher auch zweimal eine destruktor funktion aufgerufen. in dieser wird eine datenbank verbindung geschlossen, die dann beim zweiten (fälschlicherweise auftretetenden aufruf) des destruktors das problem hat das keine gültige verbindung existiert -> ungültiger mysql-link. > > kann ich verhindern, dass php automatisch einen konstruktor-aufruf an die oberklasse richtet? in php4 habe ich mich nie mit Objektorientierung beschäftigt. In php sollst du einen Konstruktor jedenfalls über die magische Methode __construct definieren: class a { function __construct() { .. } } Die Superkonstrukter werden in beiden Fällen jedoch nicht aufgerufen: "Note: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required." "PHP 4 doesn't call constructors of the base class automatically from a constructor of a derived class. It is your responsibility to propagate the call to constructors upstream where appropriate." Und bei mir funktioniert das auch: php5 -a Interactive shell php > class A { function A() { echo "Construct A"; } } php > class B extends A { function B() { echo "Construct B"; $this->A(); } } php > new B(); Construct BConstruct A php > > > bzw. fallen euch evtl. noch alternative ratschläge bezüglich des konstruktor-problems ein. > danke und gruß > lars Yannik
php::bar PHP Wiki - Listenarchive