EMZETT.
Login

Kurz: class Konto { private float stand = 0.0; public static int anzahl = 0; public const ZINS = 0.02;

Teil des Kurses PHP

Kapitel 7 von 15 im Kurs PHP (Abschnitt „Objektorientierung“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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
SichtbarkeitZugriff
publicüberall
protectedKlasse und Unterklassen
privatenur diese Klasse
  • $this ist das aktuelle Objekt, self:: die Klasse selbst, static:: die zur Laufzeit aufgerufene Klasse
  • readonly-Eigenschaften (PHP 8.1) lassen sich nur einmal setzen, ideal für unveränderliche Objekte
  • new erzeugt Objekte; Objekte werden als Handle übergeben (Änderungen wirken überall), Kopien mit clone
<?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 true

Statische 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
Mia

Magische Methoden

MethodeWann
__construct / __destructErzeugen / Zerstören
__toStringObjekt als Text
__get / __setZugriff auf nicht vorhandene Eigenschaften
__call / __callStaticAufruf nicht vorhandener Methoden
__invokeObjekt wie Funktion aufrufen
__clonenach 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) 42

Enums (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 Erledigt

Merke

  • class mit Eigenschaften, Methoden, Konstanten und static
  • Constructor Promotion und readonly machen Klassen kurz und sicher
  • Sichtbarkeit: public, protected, private
  • Objekte werden als Handle übergeben, clone kopiert
  • Magische Methoden (__toString, __get, __call, __invoke)
  • Enums für feste Wertemengen

Übungsaufgabe

Baue eine Klasse Warenkorb mit hinzufuegen, summe und __toString.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Funktionen

Weiter: Vererbung, Interfaces und Traits

Alle Kapitel: PHP im Überblick