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