mitmario.dev

Warum Pakete

PHP Sandbox 4 Min Lesezeit 4 BeispieleLektion 1 von 6

Bis hierher hast du alles selbst geschrieben. Das war der Punkt: Wer wissen will, wie eine Sprache funktioniert, schreibt die Bausteine erst einmal von Hand. In einem echten Projekt macht das niemand, und dieser Abschnitt zeigt dir, was stattdessen passiert.

Der Fall, der immer gleich anfängt

Von Hand, und fast richtig
<?php

// Aus einem Titel eine Kurzform fuer die Adresszeile machen.
// Sieht nach zehn Minuten Arbeit aus.

function kurzform(string $titel): string
{
    $klein = strtolower($titel);
    $nurWorte = preg_replace("/[^a-z0-9]+/", "-", $klein);

    return trim($nurWorte, "-");
}

foreach (["Grüße aus Köln", "Straße & Weg", "Übung macht den Meister"] as $titel) {
    echo $titel, " -> ", kurzform($titel), "\n";
}

Aus einem Titel eine Kurzform für die Adresszeile machen: Kleinbuchstaben, alles Fremde durch Bindestriche ersetzen, fertig. Zehn Minuten Arbeit, und das Ergebnis sieht auf den ersten Blick richtig aus.

Auf den zweiten nicht. Aus Grüße aus Köln wird gr-e-aus-k-ln, aus Straße & Weg wird stra-e-weg, und das Ü am Anfang fällt ganz weg. Schuld ist die Zeile mit preg_replace(): Sie ersetzt alles, was auf ein Muster passt, und das Muster [^a-z0-9] heißt „alles außer den Buchstaben a bis z und den Ziffern”. Ein ü ist keiner davon, also fliegt es raus. Für eine deutsche Seite ist die Funktion damit unbrauchbar.

Solche Muster heißen reguläre Ausdrücke, und sie kommen in diesem Kurs sonst nicht vor. Du musst sie für diese Lektion nicht können, es geht hier um etwas anderes.

Und der Fall, der immer gleich weitergeht

Zwei Jahre später
<?php

// Dieselbe Funktion, nachdem drei Kollegen je einen Fehler gemeldet
// haben. Sie laeuft hier absichtlich nicht, sie ist zum Ansehen da.

function kurzform(string $titel): string
{
    // Nachtrag Mai: Umlaute wurden verschluckt (Ticket 118)
    $ersatz = ["ä" => "ae", "ö" => "oe", "ü" => "ue", "ß" => "ss"];
    $titel = strtr(mb_strtolower($titel), $ersatz);

    // Nachtrag Juli: das kaufmaennische Und fiel raus (Ticket 140)
    $titel = str_replace("&", " und ", $titel);

    // Nachtrag September: franzoesische Titel wurden zu Bindestrichen
    // $titel = ...? Wie war das noch mit den Akzenten?

    $nurWorte = preg_replace("/[^a-z0-9]+/", "-", $titel);

    return trim($nurWorte, "-");
}

Das ist dieselbe Funktion, zwei Jahre später. Drei Meldungen, drei Nachträge, ein offener Kommentar. Sie läuft hier nicht, sie ist zum Ansehen da: Das Wachstum ist der Inhalt, nicht die Ausgabe.

Jeder Nachtrag war für sich vernünftig, und keiner war falsch. Trotzdem steht am Ende Code da, den niemand mehr anfassen will, der in vier Projekten in vier verschiedenen Ständen liegt, und bei dem niemand mehr weiß, welcher davon der neueste ist. Das ist kein Anfängerproblem. Genau so entstehen die Ordner mit den Namen helfer_alt, helfer_neu und helfer_neu2.

Jemand anders hat dieselbe Funktion geschrieben, hat dieselben drei Meldungen bekommen und noch vierzig weitere, und pflegt sie seit acht Jahren. Sein Paket kannst du benutzen.

Was eine Kennung wirklich kostet

Eine Kennung von Hand
<?php

// Eine eindeutige Kennung, wie sie jede Bestellung braucht.
// Sechs Zeilen, und jede einzelne davon muss stimmen.

function kennung(): string
{
    $daten = random_bytes(16);

    // Vier Bit fuer die Version, zwei fuer die Variante. Steht so im
    // Standard, und ohne diese zwei Zeilen ist es keine Kennung nach
    // Version 4, sondern nur Zufall in der richtigen Laenge.
    $daten[6] = chr(ord($daten[6]) & 0x0f | 0x40);
    $daten[8] = chr(ord($daten[8]) & 0x3f | 0x80);

    return vsprintf("%s%s-%s-%s-%s-%s%s%s", str_split(bin2hex($daten), 4));
}

echo kennung(), "\n";
echo kennung(), "\n";

Ein zweites Beispiel, weil das erste zu harmlos ist. Jede Bestellung, jede Datei, jeder Datensatz braucht irgendwann eine eindeutige Kennung, und die übliche Form heißt UUID. Sie besteht aus 32 Ziffern in Sechzehnerschreibweise, in fünf Gruppen geteilt.

Die Funktion im Beispiel erzeugt eine, und sie tut es korrekt. Sieh dir die beiden Zeilen mit den Bitmasken an: Vier Bit tragen die Versionsnummer, zwei weitere die Variante. Ohne sie kommt eine Zeichenkette heraus, die aussieht wie eine UUID, aber keine ist, und der Unterschied fällt frühestens auf, wenn ein anderes System deine Kennungen prüft.

Woher weiß man das? Aus dem Standard, den man dafür lesen muss. Und das ist der Preis, den selbstgeschriebener Code wirklich hat: nicht die zehn Zeilen, sondern das Wissen dahinter.

Dieselbe Kennung mit einem Paket
<?php

require __DIR__ . "/vendor/autoload.php";

use Ramsey\Uuid\Uuid;

echo Uuid::uuid4(), "\n";
echo Uuid::uuid4(), "\n";

Dasselbe mit ramsey/uuid. Eine Zeile bindet das Paket ein, eine kürzt den langen Klassennamen ab, und übrig bleibt Uuid::uuid4(). Die Ausgabe ist dieselbe Sorte Kennung wie oben, nur hat diesmal jemand anders den Standard gelesen, und zwar gründlicher.

Wie das Paket in die Sandbox kommt, steht in Lektion 9.3. Hier zählt nur der Vergleich der beiden Dateien nebeneinander.

Was Composer daraus macht

Composer ist der Paketverwalter von PHP, und er verwaltet drei Dinge:

  • eine Liste deiner Wünsche in der Datei composer.json: welche Pakete du willst und in welcher ungefähren Version.
  • eine Liste der Tatsachen in composer.lock: welche Pakete tatsächlich installiert wurden, auf die Ziffer genau, samt allem, was sie selbst noch mitgebracht haben.
  • einen Ordner vendor/, in dem der fremde Code liegt. Den fasst du nie an, und du liest auch nicht darin herum. Er gehört Composer.

Die Pakete selbst liegen auf Packagist, dem Verzeichnis für PHP-Pakete. Dort suchst du, dort steht, wie viele Projekte ein Paket benutzen, und dort findest du den Link zum Quelltext.

Warum vendor/ nicht in die Versionsverwaltung gehört

Der Ordner vendor/ wird nicht mitgesichert und nicht mit hochgeladen. Er enthält nichts, was du geschrieben hast, er ist groß, und er lässt sich jederzeit wiederherstellen: Aus composer.json und composer.lock baut ein einziger Befehl denselben Stand noch einmal auf, auf jedem Rechner und auf dem Server.

Deshalb steht vendor/ in praktisch jedem PHP-Projekt in der Datei .gitignore, und deshalb sind die beiden anderen Dateien so wichtig: Sie sind das Rezept. Der Kuchen wird neu gebacken.

Zum Mitnehmen

Fast jedes Problem, das du in den nächsten Jahren löst, hat schon jemand gelöst. Composer ist der Weg, dessen Lösung zu benutzen, ohne sie zu kopieren, und sie später wieder loszuwerden, ohne zu suchen, wo du sie überall hingelegt hast.

Jetzt du

Basis Konto, kostenlos

Im Editor änderst du die Beispiele dieser Lektion und lässt sie gleich laufen. So merkst du am schnellsten, ob es sitzt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.