Eine PHP-Klasse wird mit class Name { ... } deklariert und enthält Eigenschaften (Variablen) und Methoden (Funktionen). new Name() erzeugt daraus ein Objekt, und -> liest eine Eigenschaft oder ruft eine Methode auf: $user->name, $user->greet().
Die Klasse ist der Bauplan, das Objekt ist ein Ding, das danach gebaut wurde. Du kannst aus einer Klasse so viele Objekte erzeugen, wie du brauchst, und jedes hat seine eigenen Eigenschaftswerte.
Eigenschaften und Methoden
Eine Eigenschaft wird mit einem Sichtbarkeits-Schlüsselwort, einem optionalen Typ und einem optionalen Standardwert deklariert. Eine Methode ist eine Funktion in der Klasse. In einer Methode ist $this das Objekt, auf dem die Methode aufgerufen wurde, also liest $this->balance den Kontostand dieses Objekts.
Jedes Objekt behält sein eigenes $balance: Eine Einzahlung auf $a berührt $b nicht. Eigenschaften nach new einzeln zu setzen wird mühsam; ein Konstruktor nimmt die Startwerte stattdessen als Argumente.
public, private und protected
Die Sichtbarkeit bestimmt, wer eine Eigenschaft anfassen oder eine Methode aufrufen darf:
| Schlüsselwort | Zugänglich aus |
|---|---|
public | überall |
protected | der Klasse selbst und Klassen, die sie erweitern |
private | nur der Klasse, die es deklariert |
Eine Eigenschaft private zu machen und Methoden anzubieten ist der Weg, wie eine Klasse ihre eigenen Regeln schützt. Hier kann sich der Kontostand nur über deposit() und withdraw() ändern, die ungültige Beträge ablehnen:
Die private Eigenschaft von außerhalb der Klasse zu lesen ist keine Warnung, sondern ein Error:
Typisierte Eigenschaften und nicht initialisierte Werte
Eine typisierte Eigenschaft ohne Standardwert ist zu Beginn nicht initialisiert, und das ist etwas anderes als null. Sie zu lesen, bevor etwas zugewiesen wurde, wirft einen Error. Gib ihr entweder einen Standardwert, weise ihr im Konstruktor etwas zu oder mach sie mit ?Type und = null nullable.
Typen werden bei der Zuweisung durchgesetzt. Im Standardmodus (nicht strikt) wandelt $p->stock = '7' den numerischen String in 7 um, während $p->stock = 'many' einen TypeError wirft.
readonly-Eigenschaften
Eine readonly-Eigenschaft (PHP 8.1) lässt sich einmal beschreiben, aus der Klasse heraus, und danach nie wieder. Das ist der übliche Weg, Value Objects wie Geldbeträge oder IDs zu bauen. PHP 8.2 brachte readonly class, die jede Eigenschaft readonly macht.
Eine readonly-Eigenschaft muss einen Typ haben und darf keinen Standardwert haben. Wenn du eine geänderte Kopie brauchst, erzeugst du ein neues Objekt (new Order('B-2002')), statt das alte zu bearbeiten.
Ein Objekt mit __toString ausgeben
echo $object funktioniert nur, wenn die Klasse __toString() definiert. Die Methode liefert den String, den PHP verwenden soll, wann immer das Objekt als Text behandelt wird: bei echo, beim Verketten von Strings, in "{$object}".
Ohne __toString wirft echo $object einen Error („Object of class Money could not be converted to string“). Zum Debuggen funktionieren print_r() und var_dump() mit jedem Objekt und zeigen auch private Eigenschaften; siehe var_dump und print_r.
Eine Zuweisung kopiert ein Objekt nicht
Das ist der Fehler, der die meisten trifft, die von Arrays kommen. Ein Array zuzuweisen kopiert es. Ein Objekt zuzuweisen kopiert nur den Verweis: Beide Variablen zeigen dann auf dasselbe Objekt.
clone macht eine flache Kopie: Enthält eine Eigenschaft ein weiteres Objekt, teilen sich beide Kopien weiterhin dieses innere Objekt. === ist nur bei demselben Objekt wahr, während == die Eigenschaftswerte zweier Objekte derselben Klasse vergleicht. Ein Objekt an eine Funktion zu übergeben funktioniert genauso wie eine Zuweisung, also kann eine Funktion das Objekt ändern, das sie bekommt.
Häufig gestellte Fragen
Wie erstelle ich in PHP ein Objekt aus einer Klasse?
Mit new und dem Klassennamen: $user = new User();. Hat die Klasse einen Konstruktor, übergibst du seine Argumente in den Klammern, etwa new User('Ada'). Danach rufst du Methoden auf und liest Eigenschaften mit dem Pfeiloperator: $user->name, $user->greet().
Was bedeutet $this in PHP?
$this ist das Objekt, auf dem die aktuelle Methode aufgerufen wurde. In $ada->greet() ist $this gleich $ada, also liest $this->name Adas Namen. Es existiert nur in nicht statischen Methoden.
Was ist der Unterschied zwischen public, private und protected in PHP?
public-Member lassen sich von überall verwenden, private-Member nur aus der Klasse, die sie deklariert, und protected-Member aus dieser Klasse und ihren Kindklassen. Eine private Eigenschaft von außen zu lesen wirft einen Error: Cannot access private property.
Werden Objekte in PHP per Referenz übergeben?
Eine Variable enthält einen Verweis auf das Objekt, nicht das Objekt selbst. $b = $a; kopiert den Verweis, also zeigen beide Variablen auf dasselbe Objekt, und eine Änderung über $b zeigt sich in $a. Verwende $b = clone $a; für eine unabhängige Kopie.
Was ist eine readonly-Eigenschaft in PHP?
Eine als public readonly string $id; deklarierte Eigenschaft (PHP 8.1+) lässt sich einmal setzen, aus der Klasse heraus, und danach nie mehr ändern. Ein zweiter Schreibversuch wirft einen Error: Cannot modify readonly property.