[Перевод] PHP 7.1: Грядущие изменения

2d529c57455848178de431ef64740b8a.png

Ниже приведены основные изменения, привнесенные 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-изменениями, которые я не упомянул, пожалуйста, дайте знать в комментариях ниже. Спасибо за прочтение.

© Habrahabr.ru