Blackwane: Klassen/Funktionen Vererben

Hallöle,

ich möchte gern den Konstruktor der Mutterklasse, an die Kindklasse übergeben.
Das funktioniert soviel ich weiß mit:
parent::__construct();
Dann müssten doch eigentlich, alle Variablen, auch in der Kindklasse verfügbar sein oder nicht?

Beispiel:

class Mutter  
{  
    public $bar = NULL;  
  
    public function __construct($bar){  
        $this->bar = $bar;  
    }  
  
    public function foo(){  
        $data = Kind::foo1();  
  
        return $data;  
    }  
}  
  
  
  
class Kind extends Mutter  
{  
    public function __construct(){  
        parent::__construct();  
    }  
  
    public static function foo1(){  
        // Fehler  
        $new = self::$bar;  
    }  
}  

Warum funktioniert das so nicht?

  1. Tach!

    ich möchte gern den Konstruktor der Mutterklasse, an die Kindklasse übergeben.
    Das funktioniert soviel ich weiß mit:
    parent::__construct();

    Aufrufen wäre das passende Verb gewesen.

    Dann müssten doch eigentlich, alle Variablen, auch in der Kindklasse verfügbar sein oder nicht?

    Das sind sie auch ohne Aufruf. Nur ihre im Parent-Konstruktor gesetzten Werte nicht.

    Beispiel:

    class Mutter

    {
        public $bar = NULL;

    public function __construct($bar){
            $this->bar = $bar;
        }

    public function foo(){
            $data = Kind::foo1();
            return $data;
        }
    }

    class Kind extends Mutter
    {
        public function __construct(){
            parent::__construct();
        }

    public static function foo1(){
            // Fehler
            $new = self::$bar;
        }
    }

    
    > Warum funktioniert das so nicht?  
      
    Es gibt doch eine schöne Fehlermeldung. Zum einen hast du für den Parameter des Parent-Konstruktors nichts übergeben. Dann hast du nicht gesagt, was du wie aufrufst. Wenn man $kind->foo() aufruft, bekommt man "Access to undeclared static property: Kind::$bar". Und da hat PHP Recht. Du rufst da eine Kind-Methode statisch auf und in diesem statischen Kontext gibt es keine statische Eigenschaft. Es gibt $bar, aber das ist an eine konkrete Instanz gebunden.  
      
    Du müsstest da vermutlich mal dein Konzept überdenken und dir zurechtlegen, wann du etwas statisch machst und aus welchem Grund und wann du Instanzen verwendest.  
      
      
    dedlfix.
    
    1. Lieber dedlfix,

      schöne Erklärung! Aber für Blackwane noch ein "funzendes" Beispiel:

      class Mutter {  
          private $bar;  
        
          public function __construct ($bar) {  
              $this->bar = $bar;  
          }  
        
          public function get_bar () {  
              return = $this->bar;  
          }  
        
          public function set_bar ($bar) {  
              $this->bar = $bar;  
          }  
      }  
        
      class Kind extends Mutter {  
          // __construct defined in Mutter class  
      }  
        
      $kind = new Kind("_bar_");  
      echo $kind->get_bar(); // _bar_  
        
      $kind->set_bar("_baz_");  
      echo $kind->get_bar(); // _baz_
      

      Wer Daten zwischen Instanzen austauschen lassen will, muss dafür besondere Methoden definieren. Da aber eine Abhängigkeit zwischen Mutter und Kind in Datenhinsicht gemeint ist, also indirekt die Mutter vom Kind erben soll, ist die Aufgabenstellung noch nicht genügend durchdacht. Da hast Du (dedlfix) natürlich absolut recht.

      Liebe Grüße,

      Felix Riesterer.

      --
      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)