Как перестать бояться стандартных функций PHP и полюбить строгую типизацию

02 Jun, 2026

Вы когда-нибудь задумывались, почему в PHP array_map принимает аргументы в одном порядке, а array_filter — в другом? Или почему strpos возвращает false, если подстрока не найдена, и 0, если она в самом начале, заставляя нас писать вечные проверки через === false? Это наследие тридцатилетней истории языка, к которому мы привыкли, но которое регулярно подкидывает баги на ровном месте.

Проект php-standard-library (сокращенно PSL) — это попытка пересобрать стандартную библиотеку PHP с нуля, сделав её предсказуемой, безопасной и современной. Ребята вдохновлялись аналогичной библиотекой из экосистемы Hack (HHVM) и создали набор API, который закрывает дыры в типизации и логике стандартных функций.

PSL

Что не так с обычным PHP

Основная проблема нативной библиотеки PHP в том, что она проектировалась в эпоху, когда о строгой типизации и исключениях особо не думали. Функции могут возвращать смешанные типы, выбрасывать ворнинги вместо исключений или молча возвращать null при ошибке.

PSL предлагает альтернативу. Если функция из этой библиотеки должна вернуть строку, она вернет строку или выбросит исключение. Никаких «иногда false, иногда ресурс». Плюс ко всему, библиотека ориентирована на работу с фиберами (Fibers), что делает её готовой к асинхронному коду из коробки.

Реклама

Валидация данных без боли

Одна из самых крутых штук в PSL — это компонент Type. Обычно при получении данных из JSON или формы мы либо пишем гору проверок is_array, isset, либо надеемся на авось. В PSL можно описать структуру данных (shape) и одним вызовом проверить всё дерево.

use Psl\Type;

$userSchema = Type\shape([
    'name' => Type\non_empty_string(),
    'age'  => Type\positive_int(),
    'tags' => Type\vec(Type\string()),
]);

// Если данные не совпадут, вылетит исключение с понятным описанием, где именно ошибка
$user = $userSchema->coerce($inputFromApi);

Интересно, что это работает без рефлексии, а значит, быстро. Статические анализаторы вроде Psalm или PHPStan прекрасно понимают такие конструкции и подсвечивают типы в IDE так, будто это нативные объекты.

Порядок в коллекциях

PHP-массивы — это одновременно и списки, и словари (хеш-таблицы). Из-за этого функции array_* часто ведут себя странно: могут сбросить индексы или перемешать ключи. В PSL коллекции разделены на логические группы Vec (индексированные списки) и Dict (ассоциативные массивы).

use Psl\Vec;
use Psl\Str;

$names = ['ivan', 'sergey', 'alex'];

// Понятный синтаксис и предсказуемый результат
$result = Vec\map($names, Str\uppercase(...));
// ['IVAN', 'SERGEY', 'ALEX']

Имена функций и порядок аргументов здесь всегда консистентны. Если вы привыкли к функциональному стилю, вам точно понравится.

Асинхронность и сетевое взаимодействие

Если вам нужно написать TCP-сервер или просто сделать несколько параллельных HTTP-запросов, PSL предлагает концепцию структурированной конкурентности. Это работает на фиберах PHP 8.1+, но избавляет от ада коллбэков (callback hell) и промисов. Код выглядит как обычный синхронный код.

Вот пример того, как запустить две задачи одновременно и дождаться их выполнения:

use Psl\Async;
use Psl\TCP;

Async\main(static function(): int {
    [$conn1, $conn2] = Async\concurrently([
        static fn() => TCP\connect('127.0.0.1', 9000),
        static fn() => TCP\connect('127.0.0.1', 9001),
    ]);
    
    return 0;
});

Это гораздо чище, чем городить event loop вручную или подключать тяжеловесные фреймворки, когда вам нужно просто распараллелить пару сетевых вызовов.

Стоит ли тащить это в проект

Библиотека требует PHP 8.4+, что как бы намекает на её ориентированность на самый свежий стек. Если вы пишете микросервис, где критична чистота типов, или создаете CLI-инструмент, PSL может сэкономить кучу времени на проверках «на дурака».

С другой стороны, если у вас уже раздутый проект на Laravel или Symfony, внедрение PSL в качестве основной библиотеки может быть избыточным — у этих фреймворков свои хелперы. Но даже там PSL можно использовать точечно, например, для той же валидации сложных массивов.

В PSL подкупает то, что она не пытается быть «фреймворком для всего». Это просто набор хорошо спроектированных кирпичиков, которые делают PHP чуть более предсказуемым и приятным языком. Если вам надоело гуглить порядок аргументов в in_array, просто попробуйте поставить этот пакет и посмотрите, как изменится ваш код.