Hauptmenü

Untermenü

OOP PHP5 - Statische Methoden und Eigenschaften - Besonderheiten

1. Zugriff auf andere Eigenschaften und Methoden

... ist in diesem Fall nicht möglich. Wegen der Sache mit dem Objektkontext und außerhalb. Folgender Code führt also zu einem bösen bösen Fehler à la Fatal error: Using $this when not in object context.


class Mensch
{
  private $geschlecht;
  private $namen;
  public static function setzWerte($geschlecht$namen) 
  { 
    $this -> geschlecht $geschlecht;
    $this -> setzNamen($namen);
  }
  private function setzNamen($value)
  {
    $this -> namen $value;
  }
}
Mensch::setzWerte('männlich''Peter');

Merke

Statische Methoden können auf alles zugreifen, was ihresgleichen ist. Und auf Konstanten in Klassen. Mehr nicht! Anders herum ist es natürlich. Also normale Methoden können auf statische Eigenschaften und Methoden zugreifen.

2. Ein beliebter Fehler

Nehmen wir mal ein etwas sinnfreies Beispiel, das euch aber noch mal die Wirkungsweise zeigen soll. Bei folgendem Code macht Dörte aus Dieter auf einmal eine Frau. Weil $geschlecht halt eine statische Eigenschaft ist.


class Mensch
{
  private static $geschlecht;    
  public function setzGeschlecht($geschlecht) 
  { 
    self::$geschlecht $geschlecht;
  }
  public function returnGeschlecht() 
  { 
    return self::$geschlecht;
  }
}
$dieter = new Mensch;
$dieter -> setzGeschlecht('männlich');  
$doerte = new Mensch;
$doerte -> setzGeschlecht('weiblich');  
echo $dieter -> returnGeschlecht();

Aber

Was passiert, wenn man anstelle von self die sonst übliche Schreibweise benutzt? Also so.


class Mensch
{
  private static $geschlecht;    
  public function setzGeschlecht($geschlecht) 
  { 
    // Uijuijui
    $this -> geschlecht $geschlecht;
  }
  public function returnGeschlecht() 
  { 
    // Uijuijui
    return $this -> geschlecht;
  }
}
$dieter = new Mensch;
$dieter -> setzGeschlecht('männlich');  
$doerte = new Mensch;
$doerte -> setzGeschlecht('weiblich');  
echo $dieter -> returnGeschlecht();

Tja, dann ist Dieter auf ein mal wieder ein Mann! Aber warum? Weil er es sein möchte. Möglich, aber in diesem Fall passiert Folgendes. Durch $this -> geschlecht wird praktisch eine neue Eigenschaft erzeugt. Dieter ist also ein Mann und Dörte eine Frau. Meiner Meinung nach handelt es sich hier um eine nicht ganz saubere Implementierung. Aber vielleicht hat sich jemand was dabei gedacht. Oder auch nicht. Die statische Eigenschaft selber bleibt aber erhalten. Das kann man schön an folgendem Code sehen (PS: Danke an Jacek für den Hinweis).


class Mensch
{
  public static $geschlecht 'neutrum';    
  public function setzGeschlecht($geschlecht) 
  { 
    $this -> geschlecht $geschlecht;
  }
  public function returnGeschlecht() 
  { 
    return $this -> geschlecht;
  }
}
$dieter = new Mensch;
$dieter -> setzGeschlecht('männlich');  
echo $dieter -> returnGeschlecht();
echo $dieter::$geschlecht;

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt