Kurz: class Konto { private float stand = 0.0; public static int anzahl = 0; public const ZINS = 0.02;
Teil des Kurses PHP
Eine Klasse definieren
<?php
declare(strict_types=1);
class Konto
{
private float $stand = 0.0;
public static int $anzahl = 0;
public const ZINS = 0.02;
public function __construct(
public readonly string $inhaber, // Constructor Promotion (8.0)
float $start = 0.0,
) {
$this->stand = $start;
self::$anzahl++;
}
public function einzahlen(float $betrag): static
{
if ($betrag <= 0) {
throw new InvalidArgumentException("Betrag muss positiv sein");
}
$this->stand += $betrag;
return $this; // für Verkettung
}
public function stand(): float { return $this->stand; }
public function __toString(): string
{
return sprintf("%s: %.2f", $this->inhaber, $this->stand);
}
}
$k = new Konto("Mia", 100);
$k->einzahlen(50)->einzahlen(25.5);
echo $k, "\n";
echo Konto::$anzahl, " ", Konto::ZINS, " ", $k->inhaber, "\n";
try {
$k->inhaber = "Tom"; // readonly
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
try {
$k->einzahlen(-5);
} catch (InvalidArgumentException $e) {
echo "Fehler: ", $e->getMessage(), "\n";
}Ausgabe:
Mia: 175.50
1 0.02 Mia
Cannot modify readonly property Konto::$inhaber
Fehler: Betrag muss positiv sein| Sichtbarkeit | Zugriff |
|---|---|
public | überall |
protected | Klasse und Unterklassen |
private | nur diese Klasse |
$thisist das aktuelle Objekt,self::die Klasse selbst,static::die zur Laufzeit aufgerufene Klassereadonly-Eigenschaften (PHP 8.1) lassen sich nur einmal setzen, ideal für unveränderliche Objektenewerzeugt Objekte; Objekte werden als Handle übergeben (Änderungen wirken überall), Kopien mitclone
<?php
class Punkt { public function __construct(public int $x = 0, public int $y = 0) {} }
$a = new Punkt(1, 2);
$b = $a; // gleiches Objekt
$c = clone $a; // Kopie
$b->x = 99;
echo $a->x, " ", $c->x, " ", var_export($a == $c, true), " ", var_export($a === $b, true), "\n";Ausgabe:
99 1 false trueStatische Methoden und Konstanten
<?php
class MathHelfer
{
public const PI = 3.14159;
public static function kreisflaeche(float $r): float { return self::PI * $r ** 2; }
}
echo MathHelfer::kreisflaeche(2), "\n";
class Nutzer
{
private function __construct(public string $name) {}
public static function erstelle(string $name): self { return new self(ucfirst($name)); } // Fabrikmethode
}
echo Nutzer::erstelle("mia")->name, "\n";Ausgabe:
12.56636
MiaMagische Methoden
| Methode | Wann |
|---|---|
__construct / __destruct | Erzeugen / Zerstören |
__toString | Objekt als Text |
__get / __set | Zugriff auf nicht vorhandene Eigenschaften |
__call / __callStatic | Aufruf nicht vorhandener Methoden |
__invoke | Objekt wie Funktion aufrufen |
__clone | nach dem Klonen |
<?php
class Meine
{
private array $daten = [];
public function __get($n) { return $this->daten[$n] ?? "?"; }
public function __set($n, $v) { $this->daten[$n] = $v; }
public function __call($n, $args) { return "$n(" . implode(",", $args) . ")"; }
public function __invoke($x) { return $x * 2; }
}
$m = new Meine();
$m->farbe = "rot";
echo $m->farbe, " ", $m->gibtEsNicht, " ", $m->irgendwas(1, 2), " ", $m(21), "\n";Ausgabe:
rot ? irgendwas(1,2) 42Enums (PHP 8.1)
<?php
enum Status: string
{
case Offen = 'offen';
case Erledigt = 'erledigt';
public function label(): string
{
return match ($this) {
self::Offen => "Noch zu tun",
self::Erledigt => "Fertig",
};
}
}
echo Status::Offen->value, " ", Status::from('erledigt')->label(), " ", Status::tryFrom('x')?->label() ?? "unbekannt", "\n";
foreach (Status::cases() as $s) echo $s->name, " ";
echo "\n";Ausgabe:
offen Fertig unbekannt
Offen ErledigtMerke
classmit Eigenschaften, Methoden, Konstanten undstatic- Constructor Promotion und
readonlymachen Klassen kurz und sicher - Sichtbarkeit:
public,protected,private - Objekte werden als Handle übergeben,
clonekopiert - Magische Methoden (
__toString,__get,__call,__invoke) - Enums für feste Wertemengen
Übungsaufgabe
Baue eine Klasse Warenkorb mit hinzufuegen, summe und __toString.
Quiz zur Selbstkontrolle
Was bewirkt readonly bei einer Eigenschaft?
- Sie kann nur einmal gesetzt werden (richtig)
- Sie ist unsichtbar
- Sie ist statisch
- Sie wird gelöscht
Was macht clone?
- Erzeugt eine Kopie des Objekts (richtig)
- Löscht das Objekt
- Gibt eine Referenz zurück
- Vergleicht zwei Objekte
Wofür ist __toString?
- Objekt als Text ausgeben (richtig)
- Objekt löschen
- Objekt vergleichen
- Objekt kopieren
Weiter im Kurs
Zurück: Funktionen
Weiter: Vererbung, Interfaces und Traits
Alle Kapitel: PHP im Überblick