TGViewer
Пых Пых @phpyh · 7.87K subscribers
Post #952 6.66K
Whole Value a.k.a. Value Object

Я сейчас работаю над кодом, которому для работы требуется список параметров функции:


/**
* @param list<ReflectionParameter> $parameters
*/
function make(array $parameters): Something {}


На первый взгляд, всё здорово. list<ReflectionParameter> выражает минимально необходимое знание для решения задачи да и вообще это список из объектов-значений, а не каких-то там примитивов.

Но есть нюанс.

В такой make можно передать невозможный список параметров, например:


$trimReflection = new ReflectionFunction(trim(...));

make(array_reverse($trimReflection->getParameters()));


С точки зрения типов всё верно, но инвариант "опциональные параметры идут после обязательных" в переданном списке нарушен, что может привести к неправильной работе функции. Можно передать параметры от разных функций (тогда $parameters[$i]->getDeclaringFunction() будет давать неконсистентный результат), можно поставить вариадик в начало — способов задать неверный список много, потому что list<ReflectionParameter> ничего толком не регламентирует.

Если функция работает с концепцией "список параметров валидной сигнатуры", она должна принимать ReflectionFunctionAbstract и сама вызывать getParameters():


function make(ReflectionFunctionAbstract $function): Something
{
$parameters = $function->getParameters();

// ...
}


Теперь в теле make можно быть уверенным, что список параметров удовлетворяет всем инвариантам, ведь отрефлексировать функцию с неверной сигнатурой не получится...

Хотя подождите... Можно же так поломать:


final class MessedReflectionFunction extends ReflectionFunction
{
public function getParameters(): array
{
return array_reverse(parent::getParameters());
}
}

make(new MessedReflectionFunction(trim(...)));


Но это уже разговор про LSP и что наследники не должны нарушать инварианты родителей — тема для другого поста. 😊

Мораль такая: принимайте не просто минимум знаний, а минимум, гарантирующий необходимые инварианты. Это и есть концепция Whole Value.

Этот пост я разместил неделю назад в 🐘 PHPeople.
  • 👍 23
  • ❤ 9
  • 🥴 6
  • 🤯 5
  • 🔥 4
  • 👎 1
  • 👏 1
  • 🤔 1
More from @phpyh
  1. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  2. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  3. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  4. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
  5. Sep 10, 2026Краткое содержание: завтра в 12:00 открываю набор на Хардкорный курс асинхронного PHP с уч…
  6. Sep 10, 2026Post #1011
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 →