phpbar.de logo

Mailinglisten-Archive

[php] konstruktor und vererbung

[php] konstruktor und vererbung

Yannik Hampe yannik at cipher-code.de
Don Nov 1 15:02:50 CET 2007



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