PHP und OOP: Teil 3, Statische Inhalte

PHP Egret

class Egret {

  protected $size; // cm
  protected static $counter = 0;

  public function __construct() {
    $this->size = rand(27, 230);
    self::$counter++;
  }

  public function __destruct() {
    echo 'Krawg! Kraahg!! *I am dying!*' . PHP_EOL;
    self::$counter--;
  }

  public function getSize() {
    return $this->size;
  }

  public static function getCount() {
    return self::$counter;
  }

}

Attribute und Methoden einer Klasse können als statisch deklariert werden. Dafür bedarf es nur des Schlüsselwortes static. Eine Klasse kann statische und nicht-statische Inhalte mischen, wie hier im Beispiel der Klasse für einen Reiher.

Innerhalb der Klasse

public function __construct() {
  $this->size = rand(27, 230);
  self::$counter++;
}

Innerhalb der Klasse werden statische Inhalte über self:: angesprochen. Im Gegensatz zu nicht-statischen, die das Schlüsselwort $this-> verwenden und das $-Zeichen auch nicht vor der Variable steht.

Außerhalb der Klasse

echo 'Counter: ' . Egret::getCount() . PHP_EOL;
$egret = new Egret();
echo 'New egret has size: ' . $egret->getSize() . PHP_EOL;
echo 'Counter: ' . Egret::getCount() . PHP_EOL;
unset( $egret );
echo 'Counter: ' . Egret::getCount() . PHP_EOL;

Das Besondere an statischen Inhalten ist, dass sie verwendet werden können, ohne dass ein Objekt der Klasse erzeugt werden muss. Außerhalb der Klasse greift man auf sie zu, indem man den Klassennamen nennt, gefolgt von zwei Doppelpunkten. Die Ausgabe hier ist:

Counter: 0
New egret has size: 173 cm
Counter: 1
Krawg! Kraahg!! *I am dying!*
Counter: 0

Ein Zugriff über ein Objekt wäre aber auch möglich. Also in dieser Weise:

$egret = new Egret();
echo 'Counter: ' . $egret::getCount(); // "Counter: 1"

Fehler

public static function getSizeStatic() {
  return $this->size . ' cm';
}

Der Getter für die Reiher-Größe ist nun als statisch deklariert. PHP hält sich den Bauch und erbricht Folgendes:

PHP Fatal error: Using $this when not in object context

Nicht-statische Attribute ($this->) existieren nur zusammen mit ihrem Objekt. Deshalb können statische Methoden, die Objekt-unabhängig sind, nicht auf sie zugreifen. Umgekehrt können aber nicht-statische Methoden auf statische Attribute (self::) zugreifen, da diese immer existieren. Im Beispiel wird so über den Konstruktor der statische Zähler $counter erhöht.


Vorherige Artikel

Zum Mehrlesen