TGViewer
Пых Пых @phpyh · 7.83K subscribers
Post #614 7.95K
👀 Бессмысленная истина

Недавно в Пыхтелке кто-то возмутился, что для пустой коллекции Illuminate\Support\Collection::every() возвращает true. Я сходу ответил:

Так и должно быть. В PHP 8.4 аналогично для пустого массива array_all вернёт true, array_any — false.


Согласитесь, ответ неубедительный. Давайте формально докажем, что функция array_all должна возвращать true для пустого массива. В качестве примера возьмём фильтр положительных чисел:


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

assert(array_all($ints, $isPositive));


Чтобы не рассуждать по-дилетантски, попробуем вспомнить классическую логику. Там есть такая операция — импликация (логическое следование). Она описывает связь посылка ⇒ следствие. Таблица истинности:


Пример | a | b | a ⇒ b
-----------------------------------------------------
Верно, что если Солнце куб, то 3 <= 0 | 0 | 0 | 1
Верно, что если Солнце куб, то 3 > 0 | 0 | 1 | 1
Ложно, что если Солнце шар, то 3 <= 0 | 1 | 0 | 0
Верно, что если Солнце шар, то 3 > 0 | 1 | 1 | 1


Выглядит наивно, потому что это так называемая материальная импликация. В ней посылка и следствие не связаны по смыслу, что приводит к парадоксам. Но для нашей задачи она подойдёт.

Что говорит нам эта таблица?
1. из истины (Солнце — шар) следует только истина (3 > 0),
2. из лжи (Солнце — куб) следует всё что угодно (3 > 0, 3 <= 0).

Кстати, второе свойство мы иногда используем в быту: "Когда рак на горе свистнет, тогда можно будет купить запись Хардкорного курса PHP".

Теперь к массиву. Что такое any в PHP и every в Laravel? Это квантор всеобщности ∀, то есть условие, которое выполняется для всех элементов. Выражение array_all($ints, $isPositive) === true на языке формальной логики можно записать так:


∀ $x ∈ int : $x in $ints ⇒ $x > 0
для любого целого числа $x такого, что $x принадлежит массиву $ints, верно, что $x — положительное


Так как массив $ints пустой, то утверждение "$x принадлежит массиву $ints" ложно. Сделаем замену:


∀ $x ∈ int : false ⇒ $x > 0
для любого целого числа $x такого, что ложь, верно, что $x — положительное


А теперь применим то, что мы осознали выше: из лжи следует всё что угодно. Значит, вне зависимости от того, положительное число $x или нет, вся импликация истинна:


∀ $x ∈ int : true
для любого целого числа $x верно


Получается, что array_all($ints, $isPositive) === true всегда выполняется для пустого массива $ints.

Такая истинность называется бессмысленной (vacuous truth), так как она основана на невыполнимой посылке. По аналогии, можно будет с уверенностью сказать, что все присутствующие на Пыхапе хаскелисты боготворят PHP. 🤫
  • 🔥 54
  • 👍 25
  • 😐 10
  • 💩 6
  • 🥱 6
  • 💯 5
  • ❤ 2
  • 👎 2
  • 🤔 2
More from @phpyh
  1. Sep 30, 2026🍺 BeerPHP AI Moscow Кажется, «неделя PHP» потихоньку превращается в месяц PHP. 😅 Будет 2…
  2. Sep 28, 2026Запустили Пыхник и неделю PHP! Залетайте на первый открытый доклад от Дмитрия Dantes про к…
  3. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  4. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  5. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  6. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →