Chimicherrychanga

PHP und OOP: Teil 3, Statische Inhalte

Informatik von Seba

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

8 Kommentare

  1. avatar B
    Yay, Zeugs von dem ich nichts verstehe^^
    aber hey, ein neuer blogeintrag =)
  2. avatar Mistress My
    It’s so confusing. orz
  3. avatar Seba
    @B:
    Wer weiß, vielleicht gibt es nächste Woche ja sogar noch einen!

    @My:
    Uhm, du hast keine PHP-Kenntnisse, oder? In dem Fall ist es okay, verwirrt zu sein.
    (Ohne das Internet zu befragen, wäre ich nie darauf gekommen, was „orz“ bedeutet.)
  4. avatar Twaldigas
    Ein neuer Artikel und dann gleich zu OOP – juhu!
    Wieder sehr verständlich erklärt, wie ich finde. Gut finde ich auch, dass du auch immer Beispiele mit rein nimmst, welche nicht funktionieren und dann erklärst warum das so ist.
    Ich kannte PHP_EOL übrigens noch gar nicht. Ich habe bisher immer \n genommen.

    Gruß Twaldigas
  5. avatar Seba
    Danke. :)

    PHP_EOL habe ich mir auch erst vor Kurzem angeeignet. Scheint mir eine gute Praxis zu sein.
  6. avatar Christoph
    Die glorreiche Wiederkehr des Sebas nach gefühlten 15 Jahren: Statistische Inhalte.

    Gääääääähhhhhhhhhhhhnnnnnnnnn.

    Ach Seeeba.
  7. avatar Seba
    @Christoph: *Statische
    Und das hübsche Bild, das ich gemalt habe, interessiert wohl nicht. :(
  8. avatar Christoph
    Krawg! Kraahg!! *I am dying!*

Und jetzt du

Do not fill in these four fields:







Name, Mail und URL sind freiwillige Angaben. E-Mail-Adressen werden weder veröffentlicht noch weitergegeben. Verwendbares HTML: <a href=""> <abbr title=""> <blockquote> <cite> <code> <del> <i> <em> <b> <strong>