Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

Vor einigen Konferenzen wurde kritisiert, dass bei einer leeren Collection in Laravel (Illuminate\Support\Collection::every) der Wert true zurückgegeben wird. Meine Antwort lautete: So soll es sein. Ähnlich verhält es sich in PHP 8.4, wo array_all bei einem leeren Array true und array_any false zurückliefert.

Bedeutungslose Wahrheit – Warum leere Mengen immer „wahr“ sind

Vor einigen Konferenzen wurde kritisiert, dass bei einer leeren Collection in Laravel (Illuminate\Support\Collection::every) der Wert true zurückgegeben wird. Meine Antwort lautete: So soll es sein. Ähnlich verhält es sich in PHP 8.4, wo array_all bei einem leeren Array true und array_any false zurückliefert.

Auf den ersten Blick mag diese Antwort unbefriedigend erscheinen. Im Folgenden zeige ich, warum array_all für ein leeres Array formal true zurückgeben muss – ein klassisches Beispiel für die sogenannte „vacuous truth“, also eine bedeutungslose Wahrheit, die auf einer unerfüllbaren Prämisse basiert.

  1. Beispiel aus dem Code
    Betrachten wir folgendes Beispiel, in dem wir überprüfen, ob alle Elemente eines Arrays positive Ganzzahlen sind:

/** @var list */
$ints = [];
$isPositive = static fn (int $x): bool => $x > 0;
assert(array_all($ints, $isPositive));

Hier wird array_all($ints, $isPositive) true zurückgeben, obwohl im Array keine Zahlen enthalten sind. Wie kann das logisch korrekt sein?

  1. Universeller Quantor und leere Mengen
    Die Funktion array_all entspricht dem All-Quantor ∀ in der Logik. Formal lässt sich die Aussage so formulieren:
    „Für jedes ganze Zahl x, so dass x im Array $ints enthalten ist, gilt: x > 0.“
    In Symbolen:
    ∀ x ∈ ℤ : (x ∈ $ints) ⇒ (x > 0)

Ist das Array $ints leer, so ist die Prämisse „x ∈ $ints“ für jedes x falsch.

  1. Materiale Implikation und Wahrheitstabelle
    In der klassischen Logik verwenden wir die materiale Implikation (⇒), deren Wahrheitstabelle wie folgt aussieht:
Beispiela (Prämisse)b (Konklusion)a ⇒ b
Ist wahr, dass wenn a falsch, b beliebig001
Ist wahr, dass wenn a falsch, b beliebig011

Da für jedes x die Bedingung x ∈ $ints” falsch ist, spielt die Aussage x > 0 keine Rolle – aus einer falschen Prämisse folgt immer Wahrheit. Das Resultat lautet daher:
∀ x ∈ ℤ : false ⇒ (x > 0) ist stets wahr.

  1. Formaler Beweis und Bedeutung
    Setzt man den universellen Quantor für ein leeres Array ein, so erhält man:
    „Für jedes x ∈ ℤ gilt: false ⇒ (x > 0)“
    Da false ⇒ irgendetwas immer true ist, muss array_all($ints, $isPositive) true ergeben. Diese „bedeutungslose Wahrheit“ stützt sich allein auf die Logik der materialen Implikation und den universellen Quantor – ohne dass tatsächlich ein Element existiert, das geprüft werden muss.
  2. Alltagssinn – Ein humorvolles Beispiel
    Diese Lehre aus der formalen Logik kann man mit dem humorvollen Alltagsspruch vergleichen: „Jeder Kater, der mein Auto fährt, fährt sicher.“ Da es aber niemals einen Kater gibt, der das Auto fährt, ist die Aussage formal immer wahr – ein klassisches Beispiel für eine vacuous truth.

Fazit

Die scheinbar paradoxe Rückgabe von true für array_all bei einem leeren Array lässt sich vollständig durch die Logik der materialen Implikation erklären. Es gilt:
∀ x ∈ ℤ : (x ∈ $ints) ⇒ (x > 0)
Da im leeren Array x ∈ $ints immer false ist, folgt aus der Logik: false ⇒ irgendetwas = true.
So zeigt sich, dass „bedeutungslose Wahrheit“ – vacuous truth – ein natürlicher Bestandteil der formalen Logik ist und in Programmiersprachen wie PHP und Frameworks wie Laravel korrekt angewandt wird.