Website Erstellung/Optimierung
Webbasierte Software
Individuelle Programmierung

PHP - Qick-Tipps 25-01

Hier sind einige möglicherweise weniger verbreitete PHP-Funktionen und -Operatoren, die nützlich sein können.

<=> Spaceship-Operator

Der Spaceship-Operator <=> vereint Vergleichsfunktionen in einem Operator.

Er liefert:

  • 0, wenn beide Seiten gleich sind.
  • -1, wenn die linke Seite kleiner als die rechte Seite ist.
  • 1, wenn die linke Seite größer als die rechte Seite ist.
// Vergleich von Integern
echo 1 <=> 1; // Ausgabe: 0
echo 3 <=> 4; // Ausgabe: -1
echo 4 <=> 3; // Ausgabe: 1

// Vergleich von Strings
echo "a" <=> "a"; // Ausgabe: 0
echo "a" <=> "b"; // Ausgabe: -1
echo "b" <=> "a"; // Ausgabe: 1

match-Ausdruck

Der match-Ausdruck in PHP ist ähnlich wie der switch-Ausdruck, unterscheidet sich jedoch in einigen wichtigen Punkten. Während switch eine Kontrollstruktur ist, die verschiedene Fälle durchläuft und Anweisungen ausführt, führt match eine direkte Zuweisung durch und gibt einen Wert zurück. Dies macht match besonders nützlich für Fälle, in denen eine Variable basierend auf einem Ausdruck zugewiesen werden soll.

$status = 200;
$result = match ($status) {
    200, 201 => 'Success',
    400 => 'Bad Request',
    500 => 'Server Error',
    default => 'Unknown Status'
};

echo $result; // Ausgabe: Success

Vorteile

  • Klarheit: match-Ausdrücke sind oft kürzer und klarer als entsprechende switch-Anweisungen.
  • Sicherheit: Die strikte Typüberprüfung verhindert unerwartete Vergleiche und Fehler.
  • Effizienz: Da match eine direkte Zuweisung durchführt, kann es in bestimmten Fällen effizienter sein als switch.

Generator-Funktionen

Generator-Funktionen sind eine leistungsstarke Möglichkeit, um mit großen Datensätzen umzugehen, ohne den gesamten Datensatz gleichzeitig im Speicher halten zu müssen.

Eine Funktion, um alle Benutzer zu laden, ohne alle Datensätze auf einmal im Speicher zu halten:

function getUsers($pdo) {
    $stmt = $pdo->query("SELECT * FROM users");
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        yield $row;
    }
}

So können alle Benutzer nacheinander verarbeitet werden, es befinden sich aber immer nur die Daten für einen Benutzer im Speicher:

foreach (getUsers($pdo) as $user) {
    processUser($user);
}

Vorteile

  • Speichereffizienz: Da die Benutzerdaten Zeile für Zeile verarbeitet werden, wird nur eine Zeile gleichzeitig im Speicher gehalten. Dies ist besonders nützlich für große Datenbanktabellen.
  • Einfachheit: Die Verwendung von Generatoren vereinfacht den Code, da Sie nicht manuell den Zustand der Iteration verwalten müssen.
  • Lazy Evaluation: Die Werte werden nur dann berechnet und zurückgegeben, wenn sie tatsächlich benötigt werden, was die Leistung verbessert.

Eine weitere mögliche Einsatzmöglichkeit ist z.B. das Auslesen von großen Dateien, die zeilenweise verarbeitet werden sollen, ohne die gesamte Datei auf einmal einzulesen.

Constructor Property Promotion

Mit PHP 8 wurde die Constructor Property Promotion eingeführt, die die Definition von Klassenvariablen, die über den Konstruktor übergeben werden, vereinfacht und verkürzt. Diese Variablen können direkt als Parameter des Konstruktors gesetzt werden, ohne dass eine weitere Definition und Zuweisung erforderlich ist.

Beispiel

class CustomerDTO
{
    public function __construct(
        public string $name,
        public string $email,
        public DateTimeImmutable $birth_date
    ) {}
}

Das führt dazu, dass die Variablen in der Klasse definiert und gleichzeitig gefüllt werden.

Das obige Beispiel wird intern behandelt, als ob folgender, klassischer Code geschrieben wurde:

class CustomerDTO
{
    public string $name;
    public string $email;
    public DateTimeImmutable $birth_date;

    public function __construct(
        string $name,
        string $email,
        DateTimeImmutable $birth_date
    ) {
        $this->name = $name;
        $this->email = $email;
        $this->birth_date = $birth_date;
    }
}

Vorteile

  • Kürzere und klarere Syntax: Die Constructor Property Promotion reduziert die Menge an Boilerplate-Code, was zu einer kürzeren und klareren Klassendefinition führt.
  • Weniger Fehleranfälligkeit: Durch die direkte Zuweisung im Konstruktor wird die Wahrscheinlichkeit von Tippfehlern oder vergessenen Zuweisungen verringert.
  • Bessere Lesbarkeit: Der Code wird leichter lesbar und verständlicher, da die Variablen direkt im Konstruktor deklariert und initialisiert werden.

Previous Post Next Post