[Перевод] PHP 7.1: Грядущие изменения
Ниже приведены основные изменения, привнесенные PHP 7.1
. Для получения полного списка утвержденных и обсуждаемых на текущий момент изменений проверьте официальный PHP RFC.
- Перехват нескольких типов исключений за раз
- Поддержка
Curl HTTP/2 server push
- Области видимости для констант классов
- Возвращаемый тип
void
- Единое поведение строковых функций
- Поддержка строковых параметров в функции
list()
и новый синтаксис c[]
- Выброс предупреждения при невалидных строках в арифметике
- Объявление устаревшим
mcrypt()
и его последующее удаление
Перехват нескольких типов исключений за раз
В некоторых случаях мы обрабатываем различные исключения одинаково и нет возможности унаследовать их от общего предка, что приводит к дублированию кода. Например:
try {
// to do something
} catch (MyException $e) {
// Handle this exception
} catch (AnotherException $e) {
// Handle this in the same way as MyException
} catch (Exception $e) {
// Handle this in a different way
}
В PHP 7.1, оба исключения, обрабатываемые в примере одинаково, можно поймать одновременно:
try {
// to do something
} catch (MyException | AnotherException $e) {
// Handle these exceptions
} catch (Exception $e) {
// Handle this in a different way
}
Обратите внимание на синтаксис — это не обычный ||
оператор, который мы ассоциируем с or
, это одинарный символ |
.
Поддержка Curl HTTP/2 server push
Во-первых, что же такое server push
? Лучшим способом, возможно, будет понять это через пример.
Как вы знаете, когда пользователь делает запрос к domain.com (не берем в расчет DNS и т.д.), веб-сервер отдает ответ с кучей разметки, которую браузер затем интерпретирует и отображает. В рамках этой интерпретации, исполняемой браузером, ему необходимо понять, какие дополнительные ресурсы он должен запросить, чтобы полностью отобразить страницу. Это включает в себя CSS, файлы JavaScript и изображения.
Server push
стремится ускорить время загрузки и позволяет пропустить этот шаг, сразу направляя ресурсы клиенту напрямую.
Эта функциональность доступна в libcurl
с версии 7.44.0
, но пока нестабильна и не ушла в релиз (Подробнее: тут и тут). Для более подробной информации читайте официальный PHP RFC: ext/curl HTTP/2 Server Push Support.
Области видимости для констант классов
Константы классов в настоящее время нельзя сделать private
или protected
. Они всегда являются public
.
Например:
class Panda
{
private $pandaId;
public $name;
// This is public, and there's
// nothing you can do about it.
const MAGIC_POWER = 20;
}
PHP 7.1 вводит модификаторы видимости для констант:
class Panda
{
// Constants default to public
const MAGIC_POWER = 20;
private const LIMIT_BREAK = 30;
protected const EXPERIENCE_POINTS = 0;
public const HEALTH_POINTS = 100;
}
Это ставит константы в один ряд с другими членами класса.
Возвращаемый тип void
Возвращаемые типы были добавлены в PHP 7.0. Напомню, что это позволяет разработчику явно объявить тип возвращаемого функцией значения.
Например:
function foo(): array {
return [];
}
Начиная с PHP 7.1, можно указать, что функция имеет тип void
, т.е. она выполняет действие, но ничего не возвращает.
function i_dont_return_anything(): void {
// Perform some action
// This is perfectly valid.
return;
// This would throw a Fatal error (A
// void function must not return a
// value).
// return true;
}
Конечно, вы можете возразить, что функция всегда должна что-то возвращать, хотя бы boolean
, указывающий успешное выполнение, но это уже тема для другой статьи.
Единое поведение строковых функций
Взгляните на встроеную в PHP функцию strrpos ().
strrpos($needle, $haystack, $offset = 0);
Последний параметр поддерживает отрицательное смещение, которое вместо того, чтобы найти последнее вхождение $needle
в $haystack
начиная от начала строки, находит последнее вхождение начиная с N позиций назад от конца $haystack.
Многие связанные со строками функции PHP имеют этот необязательный параметр $offset
, а некоторые — нет. Один из ярких примеров — strpos()
. Здесь, чтобы добиться отрицательного смещения, функцию необходимо объединить с substr()
, что снижает читабельность и производительность кода.
Следующее обновление PHP устраняет данный пробел в языке, добавляя параметр $offset
и его поведение с отрицательным значением во множество стандартных функций.
Поддержка строковых параметров в функции list()
и новый синтаксис c []
В настоящее время в PHP есть возможность преобразовать массив в список переменных с помощью функции list()
:
Пример:
$myArray = ['monkey', 'tree', 'banana'];
list($monkey, $tree, $banana) = $myArray;
// $monkey is now equal to 'monkey'.
_list()
работает только с числовыми индексами массивов, начинающимися с нуля, например как в коде выше. Она не работает с ассоциативными массивами, такими как:
$myNamedArray = [
'name' => 'Amo',
'age' => 32,
'location' => 'London'
];
PHP 7.1 решает это:
list('name', 'age', 'location') = $myNamedArray;
Другим значительным улучшением PHP 7.1. является введение квадратных скобок []
для обозначения массива переменных. Это обеспечивает альтернативу list()
для разбиения массива на переменные.
[$a, $b, $c] = [1, 2, 3];
Обратите внимание, что используется тот же синтаксис, как и при создании массива:
$numbers = [1, 2, 3];
Полная информация по этому изменению доступна на странице RFC.
Выброс предупреждения при невалидных строках в арифметике
При выполнении арифметики в PHP, язык будет корректно (или нет, в зависимости от того, как вы на это смотрите) смешивает целочисленные значения со строковыми на основе содержащихся в них чисел.
Возьмем следующие примеры:
//Results in 10
$total = 5 + 5;
// Results in 10
$total = '5' + '5';
// Results in 10
$total = 5+ '5';
// Results in 10
$total = 'I ate 3 bananas yesterday' + 'and I ate 7 bananas today';
// Results in 5
$total = 5 + 'I love bananas';
Четвертый пример содержит в себе числовые значения, а т.к. все остальное вырезается, то и сумма оставшихся символов, используемых для расчета, даст в общей сложности 10. Но все равно было бы приятно увидеть предупреждение о работе с непредназначенными для подобного поведения строками.
Последний пример также демонстрирует подобное поведение в работе. В строке I love bananas
нет числовых значений и вся строка трактуется как 0.
В PHP 7.1, примеры четыре и пять вернут:
Notice: A non well formed numeric string encountered in file.php on line x
Это вносит некоторые проблемы с обратной совместимостью в тех случаях, когда ожидается молчаливая обработка подобных строк. Можно заранее преобразовать заранее строки в целое число через (int) "string"
, но лично я думаю, если вы выполняете арифметические операции на подобных строках, то стоит задуматься о качестве этого кода.
Объявление устаревшим mcrypt()
и его последующее удаление
Библиотека mcrypt
была заброшена в 2007 м году и содержит многочисленные ошибки и несмердженные патчи. Таким образом, вопрос ее включения в PHP давно уже созрел для рассмотрения.
В PHP 7.1 все mcrypt_*
функции будут выдавать уведомление E_DEPRECATED
. В PHP 7.1+1, они будут полностью удалены.
Помните, если вы используете mcrypt
в вашем PHP коде, вы делаете это неправильно.
На этом пока все, но если вы столкнетесь с какими-либо другими core
-изменениями, которые я не упомянул, пожалуйста, дайте знать в комментариях ниже. Спасибо за прочтение.