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.
Aufgabe
EinfachLassen 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 eineVisitor-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 einegetInfo()-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 vongetInfo()für jeden Besucher aus (jeweils in einer eigenen Zeile) und geben Sie dann die Gesamtbesucherzahl aus, indem Sie direkt über die Klasse mitVisitor::$totalVisitorsauf 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
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung