Funktionen und Klassen in PHP
Eine Funktion gibt einem Stück Arbeit einen Namen. Eine Klasse bündelt Daten und die Arbeit damit. Dieser Text zeigt beides an lauffähigem Code und den Punkt, an dem man von der einen zur anderen wechselt.
Das lernen Sie
Eine Funktion gibt der Arbeit einen Namen
Sobald derselbe Ablauf mit derselben fachlichen Bedeutung an zwei oder drei Stellen vorkommt, gehört er in eine Funktion. Der Gewinn ist nicht die gesparte Zeile, sondern dass eine Änderung nur noch an einer Stelle passiert. Der Gewinn ist nicht die gesparte Zeile, sondern dass eine Änderung nur noch an einer Stelle passiert.
declare(strict_types=1); function bruttoPreis(int $nettoCent, float $satz = 0.19): int { return (int) round($nettoCent * (1 + $satz)); } echo bruttoPreis(1000); // 1190 echo bruttoPreis(1000, 0.07); // 1070 echo bruttoPreis(nettoCent: 1000); // benanntes ArgumentBeachten Sie den Betrag in ganzen Cent. Das ist kein Zufall: Kommazahlen sind für Geld ungeeignet, und eine Funktionssignatur ist der beste Ort, diese Entscheidung sichtbar zu machen.
Eine Klasse hält zusammen, was zusammengehört
Wenn mehrere Funktionen immer dieselben Werte herumreichen, gehören diese Werte und die Funktionen zusammen. Genau das ist eine Klasse.
declare(strict_types=1);
final class Auftragsposition
{
public function __construct(
private readonly string $artikel,
private readonly int $menge,
private readonly int $einzelpreisCent,
) {
if ($menge < 1) {
throw new InvalidArgumentException('Menge muss mindestens 1 sein.');
}
}
public function gesamtCent(): int
{
return $this->menge * $this->einzelpreisCent;
}
public function beschreibung(): string
{
return sprintf('%dx %s', $this->menge, $this->artikel);
}
}
$pos = new Auftragsposition('Dichtung', 3, 450);
echo $pos->beschreibung(); // 3x Dichtung
echo $pos->gesamtCent(); // 1350Drei Dinge passieren hier, die eine lose Funktion nicht leisten kann. Die Prüfung im Konstruktor sorgt dafür, dass es keine Position mit Menge 0 geben kann — kein späterer Aufrufer muss das noch prüfen. Die Daten sind nach außen nicht veränderbar. Und der Name sagt, worum es geht.
Wann aus einer Funktion eine Klasse wird
Drei Anzeichen, die für eine Klasse sprechen; meist genügt schon eines, um sie ernsthaft in Betracht zu ziehen:
Der umgekehrte Fall kommt ebenso vor: Eine Klasse mit einer einzigen Methode und ohne Eigenschaften ist in Wahrheit eine Funktion. Das ist kein Fehler, nur unnötiger Aufwand beim Lesen.
Ein Beispiel aus der Praxis
Was Typangaben im Betrieb wirklich bewirken
declare(strict_types=1);
function tageBis(DateTimeImmutable $ziel): int
{
$heute = new DateTimeImmutable('today');
return (int) $heute->diff($ziel)->format('%r%a');
}
// Richtig:
echo tageBis(new DateTimeImmutable('2027-01-01'));
// Falsch — faellt SOFORT auf, nicht erst im Ergebnis:
// echo tageBis('2027-01-01');
// TypeError: tageBis(): Argument #1 ($ziel) must be of type
// DateTimeImmutable, string givenDas ist der eigentliche Nutzen: Der Fehler erscheint dort, wo er gemacht wurde, nicht drei Ebenen weiter unten. In einer gewachsenen Anwendung ist das der Unterschied zwischen fünf Minuten und einem halben Tag.
Häufige Missverständnisse
Weiterführende Quellen
- PHP-Handbuch: Funktionen Signaturen, Vorgabewerte, benannte Argumente
- PHP-Handbuch: Klassen und Objekte der vollständige Sprachteil
- PHP-Handbuch: Typdeklarationen was strict_types genau ändert
Über den Autor
Fabian Lücker ist geschäftsführender Gesellschafter der PHP-Schmiede KG in Rheine und seit 2007 in der Softwareentwicklung tätig. Er verantwortet Entwicklung und Konzeption und schreibt hier über Entscheidungen, die in echten Projekten anfallen.