Новинки в PHP 7
Здравствуйте!
3 декабря был релиз PHP 7. Мы перевели для вас описание новинок со страницы документации http://php.net/manual/en/migration70.new-features.php. Это первая часть.
Объявление скалярных типов
Теперь используются два режима преобразования типов: неявное преобразование (coercive) и явное (strict).
Для параметров доступны типы:
- строки (string),
- целые числа (int),
- числа с плавающей запятой (float),
- булевы переменные (bool).
Это дополняет набор типов данных в PHP 5: имена классов, интерфейсы, массивы (array) и callable.
<?php
//Основной режим
function sumOfInts(int ...$ints) {
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));
Результат:
int(9)
Для включения режима строгой типизации используйте директиву declare в начале файла:
declare(strict_types=1)
Режим типизации применяется к конкретному файлу. Включение строгой типизации влияет на вывод скалярных значений, возвращаемых значений, встроенных функции PHP и функций расширений.
См. также: объявление типов.
Определение типов возвращаемых значений
В PHP 7 появилась возможность объявлять тип возвращаемого значения. Это напрямую коррелирует с новым режимом типизации: при строгой типизации возвращаемые значения должны строго соответствовать заданному типу, иначе будет выброшено исключение TypeError.
Набор типов возвращаемых значений такой же, как для аргументов.
<?php
function arraysSum(array ...$arrays): array {
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
Результат:
Array (
[0] => 6
[1] => 15
[2] => 24
)
См. также: типы возвращаемых значений.
Оператор объединения со значением NULL
Оператор объединения со значением NULL (??) введен для улучшения читаемости кода в случае, когда обычно используется тернарный оператор и isset(). Оператор возвращает первый операнд, если аргумент определен и не равен NULL и второй операнд в любых других случаях.
<?php
// Принимает значение выражения $_GET['user'] и возвращает значение 'nobody'
// если оно не определено.
$username = $_GET['user'] ?? 'nobody';
// Эквивалентная запись:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
//Операторы объединения могут вызываться один за другим, что позволяет вернуть первое определенное значение для выражений $_GET['user'], $_POST['user'] и
// 'nobody'
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
Оператор «космический корабль»
Сравнивает два выражения, возвращая -1, 0 и 1, когда первый аргумент меньше, равен или больше второго соответственно. Сравнение производится с помощью обычных правил сравнения типов PHP.
<?php
//Целые
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
//С плавающей точкой (float)
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
//Строки
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
Определение константных массивов define()
Константные массивы могут быть объявлены с помощью define(). В PHP 5.6 они могли быть определены только с помощью директивы const.
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; //вывод: "cat"
?>
Анонимные классы
Поддержка объявления анонимных классов с помощью new class. Это можно использовать для объявления одноразовых объектов без написания целого класса.
<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger; }
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>
Результат:
object(class@anonymous)#2 (0) {}
См. также: анонимные классы.
Escape-последовательности юникод-символов
Юникод-символы задаются шестнадцатеричным кодом в строке с двойными кавычками или herdoc-определении. Допускается добавление одной или нескольких цифр «0» перед кодом символа.
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
Результат:
ª
ª //same as before but with optional leading 0's
香
Closure::call()
Метод Closure::call() — более производительный способ временной привязки контекста объекта к замыканию и его вызова.
<?php
class A {private $x = 1;}
//Код предыдущих версий
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // промежуточное закрытие
echo $getX();
//Код PHP 7+
$getX = function() {return $this->x;};
echo $getX->call(new A);
Результат:
1
1
Остальные нововведения — во второй части. Stay tuned.
Тем, кто хочет разрабатывать на PHP, рекомендуем профессию «Программист PHP».