Instanz- vs. statische Eigenschaften
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 15 von 91.
Wenn du eine Eigenschaft in einer Klasse erstellst, musst du 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 die Standardeinstellung. Jedes Objekt erhält eine eigene Kopie der Eigenschaft, und wenn du sie in einem Objekt änderst, wirkt sich das 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 bestimmten Objekt. Du deklarierst sie mit dem Schlüsselwort static und greifst auf sie über den Klassennamen mit :: statt ü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
Beachte, wie $count von allen Instanzen gemeinsam genutzt wird. Jedes Mal, wenn wir einen neuen User erstellen, wird dieselbe Variable $count erhöht. Innerhalb der Klasse verwenden wir self::$count, um auf die statische Eigenschaft zu verweisen.
Wichtiger Punkt: Verwende Instanzeigenschaften, wenn jedes Objekt seinen eigenen Wert benötigt. Verwende statische Eigenschaften, wenn du Daten über alle Objekte einer Klasse hinweg teilen musst, etwa zum Zählen von Instanzen oder zum Speichern von Konfigurationen.
Aufgabe
EinfachWir erstellen ein Besucher-Tracking-System, das den Unterschied zwischen Instanzeigenschaften (für jeden Besucher eindeutig) und statischen Eigenschaften (von allen Besuchern gemeinsam genutzt) veranschaulicht.
Du wirst zwei Dateien erstellen, um deinen Code zu organisieren:
Visitor.php: Definiere eineVisitor-Klasse, die einzelne Besucher erfasst und eine laufende Gesamtzahl der Besucher führt. Jeder Besucher sollte seine eigene$name-Eigenschaft (Instanzeigenschaft) haben, während eine$totalVisitors-Eigenschaft von allen Instanzen gemeinsam genutzt werden sollte (statische Eigenschaft). Der Konstruktor akzeptiert einen Namen, weist ihn zu und erhöht die Gesamtzahl der Besucher. Füge einegetInfo()-Methode hinzu, die"[name] is visitor #[totalVisitors]"zurückgibt.main.php: Binde die Klassendatei von Visitor ein und erstelle anschließend drei Besucher mit den Namen"Alice","Bob"und"Charlie"(in dieser Reihenfolge). Nachdem alle drei erstellt wurden, gib das Ergebnis des Aufrufs vongetInfo()für jeden Besucher aus (jeden in einer eigenen Zeile). Gib anschließend die Gesamtzahl der Besucher aus, indem du direkt über die Klasse auf die statische Eigenschaft zugreifst:Visitor::$totalVisitors.
Denke daran, dass du innerhalb der Klasse auf statische Eigenschaften mit self::$propertyName zugreifst, während du außerhalb der Klasse ClassName::$propertyName verwendest. Auf Instanzeigenschaften greifst du wie gewohnt mit $this->propertyName zu.
Deine Ausgabe sollte jeden Besucher mit seiner zugewiesenen Nummer anzeigen, gefolgt von der endgültigen Gesamtzahl in der letzten Zeile.
Probier es selbst
<?php
// Die Visitor-Klasse einbinden
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 (jedes in einer eigenen Zeile)
// TODO: Gib die Gesamtanzahl der Besucher mit 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 OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler