Konstruktoren in PHP 4 und 5

Eine der Änderungen die sich von PHP 4 nach PHP 5 ergab war, dass die Konstruktoren von Klassen anders zu benennen sind. Der Konstruktor, also die Methode die automatisch ausgeführt wird, wenn eine Klasse instanziiert wird, musste in PHP 4 denselben Namen haben wir die Klasse selbst. In PHP 5 ist der Konstruktor aber anders zu bennen. Die Methode muss den Namen __construct() haben. Eine Klasse foo müsste in PHP 4 also so aussehen:

class foo
{
   function foo ()
   {
      echo "Ich bin der Konstruktor";
   }
}

die PHP 5 Variante sieht so aus:

class foo
{
   public function __construct ()
   {
      echo "Ich bin der Konstruktor";
   }
}

In beiden Varianten würde der Text Ich bin der Konstruktor ausgegeben, wenn ein neues Objekt der Klasse instanziiert wird. Die PHP 4-Variante kann übrigens auch mit PHP 5 ausgeführt werden. Um eine bessere Abwärtskompatibilität zu gewährleisten kann PHP 5 also mit Konstruktoren in beiden Varianten umgehen.

Jetzt stellt sich aber die interessante Frage wie eine Klasse sich verhält, wenn Konstruktoren in beiden Varianten da sind. Würde die Klasse mit PHP 4 ausgeführt, dann ist das (vielleicht) kein Problem, da PHP 4 den Konstruktor __construct() nicht kennt. Allerdings dürfte die Methode __construct() dann nicht als public function __construct() deklariert werden, sondern nur als function __construct(), da PHP 4 dieses Schlüsselwort och nicht kennt. Aber was passiert mit PHP 5? Wird ein Objekt dieser Klasse instanziiert, dann wird nur die PHP 5 Variante ausgeführt:

class foo
{
   public function foo ()
   {
      echo "Ich bin der PHP 4 Konstruktor";
   }
   public function __construct ()
   {
      echo "Ich bin der PHP 5 Konstruktor";
   }
}

Das heißt, es wird nur der Text Ich bin der PHP 5 Konstruktor ausgegeben. War eigentlich zu erwarten, oder? Interessant wird es aber, wenn die beiden Varianten gemischt werden, beipsielsweise enn die eine Klasse ein Elter ist und die andere Klasse abgeleitet ist. Diese Variante führt zu einem Fatal Error:

class foo
{
   public function __construct ()
   {
      echo "Ich bin der PHP 5 Konstruktor";
   }
}
 
class bar extends foo 
{
    public function bar()
    {
        parent::foo();
    }
}
 
new bar();

Logisch, die Methode foo() ist in der Superklasse ja auch nicht deklariert. Diese Version funktioniert insteressanterweise aber:

class foo
{
   public function foo()
   {
      echo "Ich bin der PHP 4 Konstruktor";
   }
}
 
class bar extends foo 
{
    public function bar()
    {
        parent::__construct();
    }
}
 
new bar();

Kurios, wie ich finde. Aber so ist PHP halt 😉

Einen Kommentar schreiben