Menu
Coddy logo textTech

Instanz- vs. statische Eigenschaften

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 15 von 91.

Wenn Sie eine Eigenschaft in einer Klasse erstellen, müssen Sie entscheiden, ob sie zu jedem einzelnen Objekt oder zur Klasse selbst gehört. Diese Unterscheidung ist der Unterschied zwischen Instanzeigenschaften und statischen Eigenschaften.

Instanzeigenschaften sind der Standard. Jedes Objekt erhält seine eigene Kopie der Eigenschaft, und das Ändern dieser in einem Objekt wirkt sich nicht auf andere aus:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

Ausgabe:

Alice
Bob

Statische Eigenschaften gehören zur Klasse, nicht zu einem spezifischen Objekt. Sie deklarieren sie mit dem Schlüsselwort static und greifen auf sie über den Klassennamen mit :: anstatt über ein Objekt mit -> zu:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

Ausgabe:

2

Beachten Sie, wie $count über alle Instanzen hinweg gemeinsam genutzt wird. Jedes Mal, wenn wir einen neuen User erstellen, erhöht sich dieselbe $count-Variable. Innerhalb der Klasse verwenden wir self::$count, um auf die statische Eigenschaft zu verweisen.

Wichtiger Punkt: Verwenden Sie Instanzeigenschaften, wenn jedes Objekt seinen eigenen Wert benötigt. Verwenden Sie statische Eigenschaften, wenn Sie Daten über alle Objekte einer Klasse hinweg teilen müssen, wie zum Beispiel beim Zählen von Instanzen oder beim Speichern von Konfigurationen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Besucher-Tracking-System erstellen, das den Unterschied zwischen Instanzeigenschaften (einzigartig für jeden Besucher) und statischen Eigenschaften (gemeinsam genutzt von allen Besuchern) verdeutlicht.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • Visitor.php — Definieren Sie eine Visitor-Klasse, die einzelne Besucher verfolgt und eine laufende Zählung der Gesamtbesucher führt. Jeder Besucher sollte seine eigene $name-Eigenschaft (Instanzeigenschaft) haben, während eine $totalVisitors-Eigenschaft über alle Instanzen hinweg gemeinsam genutzt werden sollte (statische Eigenschaft). Der Konstruktor akzeptiert einen Namen, setzt diesen und erhöht die Gesamtzahl der Besucher. Fügen Sie eine getInfo()-Methode hinzu, die "[name] is visitor #[totalVisitors]" zurückgibt.
  • main.php — Binden Sie die Visitor-Klassendatei ein und erstellen Sie dann drei Besucher mit den Namen "Alice", "Bob" und "Charlie" (in dieser Reihenfolge). Nachdem Sie alle drei erstellt haben, geben Sie das Ergebnis des Aufrufs von getInfo() für jeden Besucher aus (jeweils in einer eigenen Zeile) und geben Sie dann die Gesamtbesucherzahl aus, indem Sie direkt über die Klasse mit Visitor::$totalVisitors auf die statische Eigenschaft zugreifen.

Denken Sie daran, dass Sie innerhalb der Klasse auf statische Eigenschaften mit self::$propertyName zugreifen, während Sie von außerhalb der Klasse ClassName::$propertyName verwenden. Auf Instanzeigenschaften wird wie gewohnt mit $this->propertyName zugegriffen.

Ihre Ausgabe sollte jeden Besucher mit seiner zugewiesenen Nummer zeigen, gefolgt von der endgültigen Gesamtzahl in der letzten Zeile.

Spickzettel

Instanzeigenschaften gehören zu jedem einzelnen Objekt, während statische Eigenschaften zur Klasse selbst gehören und von allen Instanzen gemeinsam genutzt werden.

Instanzeigenschaften:

Jedes Objekt erhält seine eigene Kopie der Eigenschaft:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name; // Alice
echo $bob->name;   // Bob

Statische Eigenschaften:

Deklariert mit dem Schlüsselwort static und von allen Instanzen gemeinsam genutzt:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count; // 2

Zugriff auf statische Eigenschaften:

  • Innerhalb der Klasse: self::$propertyName
  • Außerhalb der Klasse: ClassName::$propertyName

Zugriff auf Instanzeigenschaften:

  • Innerhalb der Klasse: $this->propertyName
  • Außerhalb der Klasse: $object->propertyName

Probier es selbst

<?php
// Binde die Visitor-Klasse ein
require_once 'Visitor.php';

// TODO: Erstelle drei Besucher mit den Namen "Alice", "Bob" und "Charlie" (in dieser Reihenfolge)

// TODO: Gib das Ergebnis von getInfo() für jeden Besucher aus (jeweils in einer eigenen Zeile)

// TODO: Gib die Gesamtzahl der Besucher unter Verwendung von Visitor::$totalVisitors aus
?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung