Новинки в PHP 7

Новое и интересное.
01 января 2016AnonymousВиктор Родионов7714312

Здравствуйте!

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"

?>

См. также: arrays, const

Анонимные классы

Поддержка объявления анонимных классов с помощью 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».

phpphp7features
Нашли ошибку в тексте? Напишите нам.