Подборка свежих новостей и материалов из мира PHP. В выпуске: вторая альфа PHP 8.1.0 и обзор того, что еще может войти в релиз; новый RFC с предложением добавить механизм защиты от инъекций. А также порция полезных инструментов, статьи, видео и подкасты.
Приятного чтения!
Новости
PHP 8.1.0 alpha 2
Вторая альфа доставлена по расписанию.
Заморозка фич ожидается 20 июля. Это значит, что RFC опубликованные после 22 июня уже точно не попадают в 8.1.
Итого имеем из того, что уже точно будет:
- Enum они же перечисления RFC;
- Новый тип
never
для возвращаемых значений RFC; - Файберы RFC;
- Финальные константы в классах RFC;
- Оператор распаковки поддерживает массивы со строковыми ключами RFC;
- Объявлено устаревшим преобразование
float
вint
, где теряется дробная часть RFC; - Интерфейс
Serializable
объявлен устаревшим RFC; - Запись восьмеричных чисел с префиксом
0o
RFC; - Ограничено использование $GLOBALS RFC;
- Пересечения типов RFC;
Полный список изменений можно посмотреть на php.watch/versions/8.1.
И под вопросом остаются еще следующие (с моим прогнозом):
- [RFC] Partial Function Application — пока по голосованию не проходит 27: 17;
Один из авторов RFC, Larry Garfield, написал пост с примерами о том, для чего нужен PFA и пайп-оператор в PHP.
- [RFC] First-class callable syntax — скорее да, если не пройдет Partial Function Application;
- [RFC] Pipe Operator v2 — возможно да, если пройдет один из двух RFC выше;
- [RFC] Property Accessors — скорее всего нет, потому что слишком сложный;
- [RFC] Readonly properties 2.0 — вероятно да, если не будет выдвинут Property Accessors;
- [RFC] New in initializers — скорее да, но с ограниченным скоупом;
- [RFC] Is_Noble — на вид однозначное предложение, но обсуждение идет туго;
PHP Internals
[RFC] Pure intersection types
В PHP 8.1 будут простые пересечения типов. Синтаксис вот такойTypeA&TypeB
и означает, что переменная должна одновременно бытьinstanceof TypeA
иinstanceof TypeB
.
Предложение принято практически единогласно, но вот как высказался об этом Дмитрий Стогов:
Например, как часто ты будешь использовать пересечения типов? Скорее всего, никогда, а тормозить они будут всегда (даже когда не используются).
Больше интересных мыслей в интервью: Дмитрий Стогов о своём пути и PHP.
[RFC] Is_Noble
Проблема SQL- и других инъекций всегда была очень острой для безопасности PHP приложений. Данный RFC предлагает частично решить вопрос подобных уязвимостей.
Предлагается добавить функциюis_noble(string $str): bool
, которая проверяет является ли переданная строка «чистой», то есть объявлена как литерал в коде, а не получена извне.
3v4l.org/1aFC2#focus=rfc.literalsis_noble('Example'); // true $a = 'Hello'; $b = 'World'; is_noble($a); // true is_noble($a . $b); // true, конкатенация двух чистых строк тоже чистая is_noble("Hi $b"); // true is_noble($_GET['id']); // false потому что данные от пользователя is_noble(sprintf('Hi %s', $_GET['name'])); // false is_noble('/bin/rm -rf ' . $_GET['path']); // false is_noble('<img src=' . htmlentities($_GET['src']) . ' />'); // false — никакой ескейпинг не делает строку чистой is_noble('WHERE id = ' . $db->real_escape_string($_GET['id'])); // false
Эту функцию можно будет использовать в пакетах для валидации входных данных и быть уверенном на 100%, что пользователь пакета не передал опасный аргумент.
[RFC] Deprecate boolean to string coercion
Предлагается задепрекейтить преобразованиеbool
вstring
, потому что результат неочевидный и с большой вероятностью приводит к багам:(string)true -> '1' (string)false -> ''
- Ilija Tovilo спрашивает идеи для простых RFC для 8.1, Никита отвечает «дженерики» :-)
Инструменты
- VKCOM/nocolor — Новый инструмент от команды VK для валидации архитектуры PHP проектов. Есть сравнение с deptrac. Был анонсирован на PHPRussia.
- beyondcode/expose 2.0 — Классный инструмент для проброса локального сервиса наружу: тестирование вебхуков, демонстрация сайтов. Аналог ngrok, только на PHP.
- nunomaduro/phpinsights v2.0 — Красивая CLI-обертка над различными инструментами контроля качества кода.
- nunomaduro/patrol — Красивый CLI анализатор зависимостей, указанных в composer.json.
- k-samuel/faceted-search — Легковесный пакет для организации фасетного поиска на сайте. Работает на чистом PHP и можно использовать на небольших данных (100_000 продуктов с 10 свойствами) до внедрения ElasticSearch.
- Ne-Lexa/php-crossplane — Парсер и билдер конфигурационных файлов NGINX. Прислал NeLexa.
Symfony
- Максимальное масштабирование демо-приложения Symfony с помощью Varnish
- Главные причины, почему мы разрабатываем веб-приложения на Symfony
- Неделя Symfony #756 (21-27 июня 2021)
Laravel
- laravelexamples.com — Каталог разных полезных примеров для Laravel от автора YouTube-канала Laravel Daily.
- Автоматическая документация по коду для API в Laravel
- Создание REST API c Ролями и Правами
- Orbit — использование Laravel без SQL
- Видео от Mohamed Said (Laravel core): 5 вещей, которые нужно учитывать при работе с контейнером в Laravel; Обмен сообщениями в режиме реального времени в Laravel — Основы про laravel/echo; Что нового в Laravel (#3) – 2021-06-23
Статьи
- PHP-Compiler, или ныряем в кроличью нору FFI.
- PHP — я бы купил это за доллар — В чем клёвость PHP.
- «Дело было вечером, делать было нечего» или краткая история о сравнении производительности языков программирования — PHP быстрее Python и Ruby, PHP вообще один из самых быстрых интерпретируемых языков.
- Чек-лист: как оставаться отказоустойчивым, переходя на микросервисы на PHP (и как правильно падать)
- Rector — The Power of Automated Refactoring — Книга по rectorphp/rector полностью готова. Ссылка со скидкой $5 специально для читателей дайджеста действует до 23 июля.
- Как насчет билдеров для конфигов? — Интересная идея от Brent Roose: вместо xml, yaml или PHP-массивов использовать объекты для конфигурационных файлов. Из плюсов получаем дополнение и валидацию в IDE из коробки.
- b-viguier/php-emoji — Функции PHP для работы с массивами объясняются с помощью emoji:
Аудио/Видео
- Пятиминутка PHP № 89: Соревнования по программированию на платформе All Cups.
- PHP Internals News podcast #89 — Про Partial Function Application с Larry Garfield и Joe Watkins.
- Никогда* не используйте массивы — Доклад Larry Garfield.
- Геометрическая интерпретация принципа подстановки Барбары Лисков — Полезно, чтобы раз и навсегда понять, что он значит.
Разное
- Интересная идея переопределить встроенные функции и отключить стандартную реализацию через disable_functions:
- Неужели Битрикс станет норм?
Подписывайтесь на Telegram-канал PHP Digest.
Если вам понравился дайджест, поставьте, пожалуйста, ему плюс — это очень мотивирует продолжать делать.
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 205
ollisso
Не совсем понимаю, что даст "[RFC] Is_Noble"?
Т.е. мы проверяем, что строка была захардкодена в коде или хотя бы «несильно изменена».
При этом: мы не гарантируем что строка изначально безопасна для любого использования. Т.е. строка может содержать кавычки которые безопасны для html, но небезопасны для sql, или же, безопасны/небезопасны в зависимисоти от того, какие кавычки используют в запросе.
Т.е. что даст эта «защита»?
VolCh
Гарантии того, что строка написана/прочитана программистами, а не внешними пользователями
ollisso
но это не даёт никакой особой гарантии :) То что программист добавил строку — не значит что она безопасна для любого использования, и даже хуже — даёт ощущение излишний безопасности.
VolCh
Может слышали про принцип "не доверяйте пользовательскому вводу"? Вот эта функция очень хороша для упрощения его реализации
ollisso
Слышал конечно. Но, и програмисту безусловно доверять нельзя. Как я выше писал — одна и таже строка может быть одновремённо и безопасна, и опасна, в зависимости от использования.
Т.е. мой основной вопрос — даст ли это что то, или это будет очередной «театр безопасности» или «ложное ощущение защищённости».
uaoleg
Айдишник прочитанный из базы будет как оценён?
Очень похоже на плохой костыль. Почему бы не пользовать обычный нормальный query builder?
BoShurik
Это как раз сделано для того, чтобы в query builder нельзя было передать пользовательский ввод. Только через placeholder-ы
mSnus
А "программистский ввод" что, можно без плейсхолдеров, напрямую? О, сколько нам ошибок чудных...
BoShurik
Увы, да. В RFC как раз есть пример:
ollisso
Вроде всё даже ок с точки зрения RFC. Везде — програмист написал код сам. Но… упасть всё может всё равно, и не особо секьюрности это добавляет.
да даже если убрать SQL Injection, это ничего не даст, кавычки то всё равно нужно использовать.
pronskiy Автор
Такая ошибка очень быстро обнаруживается на этапе разработки. А вот
->where('u.id = ' . $_GET['id']);
всплывет попозже и, вероятно, с большими потерями для бизнеса.slaFFik
Ощущение защищенности :)