6 декабря 2018 года вышел минорный релиз PHP 7.3. Далее, в порядке от более важного к менее важному, будут кратко рассмотрены основные нововведения в данном релизе PHP. (1)

Выброс исключений при ошибках в функциях json_encode() и json_decode()

Если раньше нужно было использовать ф-ю json_last_error(), то теперь можно просто отлавливать исключения. Для этого в функциях json_encode() и json_decode() нужно предавать специальную новую константу JSON_THROW_ON_ERROR:

try {
    json_encode('some invalid data...', JSON_THROW_ON_ERROR);
    json_decode('{', false, 512, JSON_THROW_ON_ERROR); 
} catch (JsonException $exception) { 
    echo $exception->getMessage();
}

Результат: «Syntax error»

Новый JsonException является наследником от Exception.

Константа JSON_THROW_ON_ERROR и сам JsonException находятся в глобальном пространстве имен.

Новые функции array_key_first() и array_key_last()

  • array_key_first() — Возвращает первый ключ массива.

  • array_key_last() — Возвращает последний ключ массива.

$colors = [

'ff0000' => 'red',

'00ff00' => 'green',

'0000ff' => 'blue',

];

echo array_key_first($colors) . PHP_EOL;

echo array_key_last($colors);

Результат:

ff0000

0000ff

Миграция с PCRE на PCRE2

PHP использует Perl Compatible Regular Expressions или коротко PCRE в библиотеке для работы с регулярными выражениями. С версии PHP 7.2 используется 8.x версия устаревшей библиотеки PCRE, а в PHP 7.3 уже используется PCRE2. Обратите внимание, что PCRE2 считается новой библиотекой, хотя в значительной степени совместима с PCRE (8.x). Новая библиотека более агрессивна к проверке регулярных выражений и может привести к ошибкам в существующем коде, который на более ранних версиях PHP работал стабильно.

Новая библитека более агрессивна в валидации паттернов и может привести к ошибкам в существующем коде. Следующий фрагмент будет невалидным с PHP 7.3:

preg_match('/[w-.]+/', '');

PHP выбросит предупреждение :

Warning: preg_match(): Compilation failed: invalid range in character class at offset 3.

Проблема с шаблоном: чтобы это работало дефис должен быть перемещен в конец или экранирован.

preg_match('/[w-.]+/', '');

Приведенный выше код отлично отработает не только с PHP 7.3, а также и с более старыми версиями. В новом паттерне дефис экранирован в -. Это самая распространенная проблема из всех с которыми можно столкнуться при решении вопросов совместимости.

Ссылки в list()

В версии PHP 7.3 стало возможным передать элемент массива по ссылке используя list():

$colors = ['red', 'green'];

list($a, &$b) = $colors;

$b = 'blue';

echo $colors[1];

Результат: blue

Также вместо ф-и list()можно использовать альтернативный синтаксис с квадратными скобками:

$colors = ['red', 'green'];

[$a, &$b] = $colors; // <--

$b = 'blue';

echo $colors[1];

Результат: blue

Регистро-независимые константы объявлены устаревшими

Ранее функция define() позволяла объявить константу в регистро-независимом режиме. Для этого необходимо было явно объявить константу как регистро-независимую, передав третьим параметром true:

define(‘Red’, ‘ff0000’, true);

Теперь, приведенный выше код будет выбрасывать уведомление:

Deprecated: define(): Declaration of case-insensitive constants is deprecated in …

Поэтому дальнейшее использование регистро-независимых констант не рекомендуется, т.к. в дальнейших релизах PHP оно скорее всего вообще будет запрещено.

Добавление функции is_countable()

countable-переменной является массив или объект реализующий Countable интерфейс. В PHP 7.3 появилась новая функция is_countable(), проверяющая переменную на возможность использования с функцией count():

$a = 1;

$b = [1, 2, 3];

var_dump(is_countable($a), is_countable($b));

Результат: bool(false) bool(true)

Поддержка конечных запятых в вызовах функций и методов

Теперь разрешено использование конечных запятых в вызовах функций и методах:

function sum($a, $b) {

return $a + $b;

}

echo sum(2, 2,); // <-- запятая в конце не вызовет ошибку

Результат: 4

(звезда) Обратите внимание, что нельзя использовать эту возможность в объявлениях функций/методов:

function sum($a, $b,) { // <-- тут запятую в конце ставить нельзя

}

Результат: Parse error: syntax error, unexpected ‘)’, expecting variable (T_VARIABLE) in …

Выброс Notice при использовании не определенной переменной в ф-и compact()

Теперь при передаче в ф-ю compact() неопределенной переменой, выбрасывается Notice:

$someVars = compact(‘someUndefinedVar’);

Результат: Notice: compact(): Undefined variable: someUndefinedVar

Улучшения хеширования паролей с помощью алгоритма Argon2

Алгоритм Argon2 имеет три варианта хеширования: Argon2i, Argon2d и Argon2id.

Argon2d работает быстрее и использует зависящий от данных доступ к памяти, что делает его очень устойчивым к атакам с крекингами GPU и подходит для приложений без угроз от атак со сторонних каналов (например, криптовалюты).

Argon2i использует независимый от данных доступ к памяти, который предпочтительнее для хеширования паролей но медленнее, поскольку для защиты от атак делает больше проходов по памяти.

Argon2id является гибридом Argon2i и Argon2d, и использует комбинацию доступа к данным, зависящим и не зависящим от данных, что дает некоторую устойчивость Argon2i к атакам на кеш-сервер и большую часть устойчивости Argon2d к атакам крекинга GPU.

Нововведение добавляет поддержку алгоритма хеширования Argon2id в функциях password_*, добавлена новая константа PASSWORD_ARGON2ID:

$somePasswordHashed = password_hash('123456', PASSWORD_ARGON2ID);

var_dump(password_verify('123456', $somePasswordHashed));

// Результат: bool(true)

Смягчение требований к синтаксису Heredoc и Nowdoc

Heredoc и Nowdoc требовали ставить закрывающий идентификатор первым в новой строке. Теперь эти требования убраны. Это сделано для улучшения читабельности кода, прежде всего чтобы можно было добавлять отступы при использовании Heredoc/Nowdoc идентификаторов:

$text = <<<IDENTIFIER

Some

long

text...

IDENTIFIER;

echo $text;

Результат:

Some

long

text...

Массив опций в функциях для работы с Cookie

В функциях setcookie(), setrawcookie() и session_set_cookie_params() параметры, используемые в заголовке: Set-Cookie, path, domain, secure и httponly — перемещены в параметр $options. При этом текущий вариант реализации, где каждый параметр является отдельным аргументом, остается работоспособным:

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false]]]]]] );

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, array $options ]]] );

bool setrawcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false]]]]]] );

bool setrawcookie ( string $name [, string $value = "" [, int $expire = 0 [, array $options ]]] );

void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] );

void session_set_cookie_params ( int $lifetime [, array $options ] );

По-умолчанию параметр $options равен пустой строке. Стандартные значения в этих ф-ях остаются без изменений.

Функция image2wbmp() объявлена устаревшей

Функция image2wbmp() из расширения GD использовалась для вывода изображения в формате WBMP (Wireless Bitmap). Теперь она объявлена устаревшей в пользу функции imagewbmp().

Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED при использовании FILTER_VALIDATE_URL объявлены устаревшими

Когда используется ф-я filter_var($var, FILTER_VALIDATE_URL), есть два дополнительных флага, которые можно поставить для обеспечения строгой проверки URL-адреса: FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED. Теперь их использовать запрещено, т.к. их роль по сути и так выполняет константа FILTER_VALIDATE_URL.

Прочие изменения

  • Добавлено новое исключение CompileError, наследуемое от ParseError и генерирующее для некоторых типов ошибок перехватываемое событие CompileError вместо фатальной ошибки.

  • Значительно расширены возможности и увеличена производительность дополнения MBString, в том числе добавлены полноценные средства для манипуляций с регистром символов (MB_CASE_LOWER, MB_CASE_UPPER, MB_CASE_TITLE, MB_CASE_FOLD и т.п.), до версии 11 обновлена поддержка спецификаций Unicode, добавлена поддержка строк, размером больше 2 Гб, в функциях mb_ereg_*() добавлена поддержка именованного захвата элементов. Объявлены устаревшими вызовы mbereg_*(), вместо которых следует использовать mb_ereg_*().

  • В SAPI-модуль FPM добавлены новые глобальные опции log_limit и log_buffering для ограничения размера выводимой в лог строки и включения режима записи в лог без буферизации. Также добавлена опция decorate_workers_output, позволяющая отключить декорирование вывода от рабочих процессов при активации режима catch_workers_output.

  • В расширении LDAP в большинстве функций, таких как ldap_add и ldap_read, появился параметр serverctrls для отправки на сервер дополнительных сообщений (LDAP Controls — механизм расширения операций LDAP и передачи дополнительной информации вместе с запросом), а в ldap_parse_result для получения клиентом дополнительных сообщений от сервера. Налажена поддержка режимов LDAP_OPT_SERVER_CONTROLS и LDAP_OPT_CLIENT_CONTROLS в функциях ldap_get_option и ldap_set_option.

  • В расширение GD в функции imagecreatefromstring() появилась поддержка создания изображений в формате WebP.

  • Представлена новая функция net_get_interfaces() для получения информации о доступных сетевых интерфейсах.

  • Улучшена работа сборщика мусора.

  • Приведены к соответствию с поведением Unix операции открытия файлов в Windows: файловые дескрипторы теперь по умолчанию открываются в Windows в режиме, допускающем чтение, запись и удаление (открытые файлы теперь можно удалить).

Видео о нововведениях PHP 7.3

https://youtu.be/dXmREkP8fIo

Sorry, the widget is not supported in this export.
But you can reach it using the following URL:

https://youtu.be/dXmREkP8fIo

Больше информации по нововведениям

См. также основные нововведения в других версиях PHP, тут: (2)

Посмотреть на расписание альфа, бета-релизов и релиз-кандидатов можно на страничке: (3)

А посмотреть список нововведений удобно на другой wiki страничке со списком всех RFC: (4)

Обзор на Habr: (5)


Источники:

(1) https://atoumus.github.io/php7.3-main-innovations.html

(2) https://wp-kama.ru/id_6310/php-evolution.html#php-7.3

(3) https://wiki.php.net/todo/php73

(4) https://wiki.php.net/rfc#php_73

(5) Хабр https://habr.com/post/422507/

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.