Mein Fehler. Nicht richtig gelesen.
<?php
class Basisklasse
{
public $basisEigenschaft = 'Hallo Welt';
public function runKindklasse1static()
{
Kindklasse1::__construct(); // statischer aufruf
}
public function runKindklasse2static()
{
Kindklasse2::__construct(); // statischer aufruf
}
public function runKindklasse2()
{
new Kindklasse2(); // normale instanzierung
}
}
class Kindklasse1 extends Basisklasse
{
public function __construct()
{
$this->basisEigenschaft = true; // funktioniert
echo $this->basisEigenschaft;
}
}
class Kindklasse2 extends Basisklasse
{
public function __construct()
{
$this->basisEigenschaft = $this->getBoolean(); // funktioniert nicht
/**
* Fatal error: Call to undefined method Basisklasse::getBoolean()
* weil statisch aufgerufen
* Basisklasse->runKindklasse2static( )
* Kindklasse2->__construct( )
*/
echo $this->basisEigenschaft;
}
public function getBoolean()
{
return true;
}
}
$obj = new Basisklasse();
$obj->runKindklasse1static(); # Ausgabe: 1
$obj->runKindklasse2(); # Ausgabe: 1
$obj->runKindklasse2static(); # Fehler
?>
Das ist ein "$this" Problem. $this macht eigentlich nix weiter, als auf Eigenschaften oder Methoden im gleichen Objekt zuzugreifen bzw. eine Referenz zu liefern.
Wenn Du eine Methode statisch aufrufst ( Kindklasse1::__construct(); ), dann müssen in der Kindklasse1 auch nachfolgende Methoden statisch aufgerufen werden.
Doppelpunkt zieht Doppelpunkt nach sich.
Folgendes wäre daher als Lösung denkbar: $this->basisEigenschaft = self::getBoolean();
Schritt für Schritt:
Kindklasse1 ist damit
nicht instanziert worden.
Nur eine Methode namens "__construct" wurde statisch aufgerufen.
Es existiert keine Referenz $this.
Innerhalb dieser Methode "__construct" wird statisch, eine weitere Methode ( self::getBoolean() ) aufgerufen. = Kein Problem. Läuft durch.
Andersherum formuliert, wenn Du $this->methodenname() als Aufruf im Kind verwendest UND die Methode auch in der Kindklasse steht, muss die Kind-Klasse selbst auch instanziert worden sein.
Ansonsten sucht PHP im aktuellen $this (dem Ausgangspunkt für den statischen Methodenaufruf) nach einem statischen Methodennamen: was auch der Fehleranzeige entspricht: Basisklasse :: getBoolean();
Lösung: Referenz $this mit "new" erzeugen. Daraufhin wird automagic der "__construct" ausgelöst.
Und eine Referenz $this zurückliefert. Wenn die Kindklasse instanziert ist, umfasst $this auch Eigenschaften und Methoden der Elternklasse (extends).
Konntest Du das nachvollziehen?