Eine Klasse definieren
php<?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";
}
AusgabeMia: 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 |
$this ist 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 Objektenew erzeugt Objekte; Objekte werden als Handle übergeben (Änderungen wirken überall), Kopien mit clone
php<?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";
Ausgabe99 1 false true
Statische Methoden und Konstanten
php<?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";
Ausgabe12.56636
Mia
Magische 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<?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";
Ausgaberot ? irgendwas(1,2) 42
Enums (PHP 8.1)
php<?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";
Ausgabeoffen Fertig unbekannt
Offen Erledigt