Websiteentwicklung: PHP: Statische Eigenschaften und Methoden

Statische Eigenschaften und Methoden Bearbeiten

Bisher mussten wir immer ein Objekt erzeugen, um auf dessen Eigenschaften und Methoden zuzugreifen. Das ist bei statischen Eigenschaften und Methoden anders: Sie können bereits aufgerufen werden, wenn die Klasse deklariert wurde.

Statische Eigenschaften Bearbeiten

Wir legen unsere ziemlich angewachsene Klasse Baum für einen Moment zur Seite (werden sie aber im Kapitel Vererbung wieder aufgreifen) und basteln uns eine neue Klasse Apfel:

<?php

class Apfel {
  public static $anzahl_aepfel = 0;
  public $farbe;

  public function __construct($farbe) {
    self::$anzahl_aepfel++;
    $this->farbe = $farbe;
  }
}

?>

Wir haben hier $anzahl_aepfel durch Angabe des Schlüsselwortes static als statische Eigenschaft deklariert. Im Gegensatz zu normalen Objekteigenschaften und -methoden werden statische Eigenschaften und -methoden mit dem Scope Resolution Operator aufgerufen (wie auch Konstanten), innerhalb einer Klasse wird auf sich selbst mit „self“ verwiesen. Um statische Eigenschaften von Konstanten trennen zu können, muss außerdem das Dollarzeichen verwendet werden. Wie du außerdem siehst, sind statische Eigenschaften entgegen ihrem Namen veränderbar.

Nun wollen wir den Code ausprobieren. Verwende dazu folgende 'index.php':

<?php
require_once 'Apfel.php';

$apfelkorb[] = new Apfel('rot');
$apfelkorb[] = new Apfel('gelb');
$apfelkorb[] = new Apfel('gruen');

echo Apfel::$anzahl_aepfel;
?>

Auf eine statische Eigenschaft greifen wir per Klassenname zu. Als Ausgabe erhältst du das erwartete Ergebnis (3). Dennoch handelt es sich um drei verschiedene Äpfel, wie var_dump($apfelkorb) zeigt. Statische Eigenschaften kann man also gut mit globalen Variablen vergleichen, sie sind vom Objekt unabhängig.

Statische Methoden Bearbeiten

Statische Methoden werden analog zu statischen Eigenschaften deklariert. Implementieren wir also einen Getter für die statische Eigenschaft $anzahl_aepfel


<?php

class Apfel {
  protected static $anzahl_aepfel = 0; // Protected, weil nicht jeder darauf direkt zugreifen soll, sondern nur über Getter- bzw. //Setter-Funktion, die in diesem Beispiel fehlt und somit eine Veränderung von Außen ausschliesst
  public $farbe;

  public function __construct($farbe) {
    self::$anzahl_aepfel++;
    $this->farbe = $farbe;
  }

  public static function getAnzahl_aepfel() {
    return self::$anzahl_aepfel;
  }
}

und rufen diese Methode auf:

<?php
require_once 'Apfel.php';

$apfelkorb[] = new Apfel('rot');
$apfelkorb[] = new Apfel('gelb');
$apfelkorb[] = new Apfel('gruen');

echo Apfel::getAnzahl_aepfel();
?>

Dies führt zur gleichen Ausgabe.

Variable Klassennamen bei statischen Aufrufen (PHP 5.3) Bearbeiten

Ab PHP-Version 5.3 können statische Aufrufe auch mit einem variablen Klassennamen geschehen. Folgender Aufruf wäre äquivalent zum obigen Beispiel:

<?php
require_once 'Apfel.php';

$apfelkorb[] = new Apfel('rot');
$apfelkorb[] = new Apfel('gelb');
$apfelkorb[] = new Apfel('gruen');

$name = 'Apfel';

echo $name::getAnzahl_aepfel();
?>

Späte statische Bindung (PHP 5.3) Bearbeiten

Ebenfalls neu seit PHP-Version 5.3 ist die späte statische Bindung („Late static binding“). Erbt eine Klasse von einer anderen, wird der Kontext von self normalerweise auf die Vaterklasse angewendet. Ein Beispiel:

<?php

class A {

  protected static function begruessung() {
    return 'Hallo!';
  }

  public static function sagHallo() {
    echo self::begruessung();
  }

}

class B extends A {

  protected static function begruessung() {
    return 'Seid gegrüßt!';
  }

}

B::sagHallo();

?>

Dies erzeugt die Ausgabe

Hallo!

da das Schlüsselwort self in dem Kontext aufgelöst wird, in dem es definiert ist. Soll dagegen der Kontext verwendet werden, in dem self aufgerufen wird, verwendet man das Schlüsselwort static anstatt self:

<?php

class A {

  protected static function begruessung() {
    return 'Hallo!';
  }

  public static function sagHallo() {
    echo static::begruessung();
  }

}

class B extends A {

  protected static function begruessung() {
    return 'Seid gegrüßt!';
  }

}

B::sagHallo();

?>
Seid gegrüßt!

Singleton-Pattern Bearbeiten

Einen praktischen Einsatz von statischen Eigenschaften und Methoden zeigt das Singleton-Pattern, welches sicherstellt, dass nur eine Instanz einer Klasse vorhanden ist und global darauf zugegriffen werden kann.

PHP-Dokumentation Bearbeiten

Folgende Abschnitte der PHP-Dokumentation wurden in diesem Kapitel behandelt: