Menu

PHP Klassen und Objekte: Eigenschaften, Methoden, $this

Eine PHP-Klasse ist ein Bauplan, deklariert mit class Name { }, und new Name() erzeugt daraus ein Objekt. Hier: Eigenschaften, Methoden, $this, public/private/protected, typisierte und readonly-Eigenschaften, __toString und warum eine Zuweisung ein Objekt nicht kopiert.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

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üsselwortZugänglich aus
publicüberall
protectedder Klasse selbst und Klassen, die sie erweitern
privatenur 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.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S