©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
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.
/** @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?
∀ x ∈ ℤ : (x ∈ $ints) ⇒ (x > 0)
Ist das Array $ints leer, so ist die Prämisse „x ∈ $ints“ für jedes x falsch.
Beispiel | a (Prämisse) | b (Konklusion) | a ⇒ b |
Ist wahr, dass wenn a falsch, b beliebig | 0 | 0 | 1 |
Ist wahr, dass wenn a falsch, b beliebig | 0 | 1 | 1 |
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.
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.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten