PHP Digest
8.53K subscribers
60 photos
3 videos
287 links
PHP Дайджест

Новости, материалы и инструменты из мира PHP — раз в месяц.

Вопросы, замечания, предложения: @pronskiy
Download Telegram
#RFC Именованные аргументы функций

https://wiki.php.net/rfc/named_params

Никита идет по списку, предложенному Ларри Гарфильдом, и выдвигает на обсуждение обновленный и проработанный документ.

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

Пропуск дефолтных значений:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401 , ini_get("default_charset"), false);
станет:
htmlspecialchars($string, double_encode: false);

Еще это важно для атрибутов, так как сейчас с ними вот такой PHPDoc:
/**
* @Route("/api/posts/{id}", methods={"GET","HEAD"})
*/

выглядел бы вот так:
<<Route("/api/posts/{id}", ["methods" => ["GET", "HEAD"]])>>

А с этим RFC будет красиво:
<<Route("/api/posts/{id}", methods: ["GET", "HEAD"])>>

Сообщество разделилось: некоторые считают, что это может создать проблемы для мейнтейнеров пакетов, потому что просто так поменять имя параметра без поломки обратной совместимости нельзя.
Принят #RFC о приведении чисел с плавающей точкой к строке без учета локали.

https://wiki.php.net/rfc/locale_independent_float_to_string

Сейчас выражение (string) 3.14 возвращает различный результат для, например, английского и русского языков: https://3v4l.org/MaUIT. Это может приводить к неприятным ошибкам в мультиязычных системах (интересные примеры в RFC).

В PHP 8 в результате принятия предложения приведение чисел с плавающей точкой будет работать одинаково во всех локалях.

setlocale(LC_ALL, 'ru_RU');
$f = 3.14;

(string) $f; // 3,14 would become 3.14
strval($f); // 3,14 would become 3.14
var_dump($f); // float(3,14) becomes float(3.14)
settype($f, "string"); // 3,14 would become 3.14
implode([$f]); // 3,14 would become 3.14

Для приведения с учетом локали можно пользоваться функциями семейства printf со спецификатором f: sprintf('%f', 3.14).

@vudaltsov | https://twitter.com/vudaltsov
#RFC И снова о синтаксисе атрибутов в PHP 8

https://wiki.php.net/rfc/shorter_attribute_syntax_change

Сначала Benjamin Eberlei подготовил детальный RFC по атрибутам и предложил синтаксис <<Attribute>>.

Предложение прошло, но позже после споров предложен другой RFC с тремя вариантами синтаксиса на голосовании: <<>>, #[] и @@.

Победил вариант @@, видимо, как максимально близкий к тегам PHPDoc и аннотациям в Java. Но автор этого RFC умолчал о проблеме с парсером и о хаке, который он применил, чтоб обойти проблему.

И вот теперь Derick Rethans автор Xdebug написал письмо в Internals, что синтаксис @@ ужасен вот почему:

▪️ Конфликт с парсером.
▪️ Большая вероятность проблем с парсингом в будущем.
▪️ Отсутствие символа в конце атрибута (с ним проще искать и проще для инструментов вроде PHPCS).
▪️ Синтаксис не используется ни в одном другом языке.
▪️ Оператор @ никогда не уйдет из PHP, а значит и атрибуты из @@ не станут @.

По следам этого письма и подготовили новый RFC, который предлагает использовать синтаксис #[ ] как в Rust.