Что нового в PHP 7

В данной заметке собраны основные (не все, только основные) изменения в PHP 7-ой версии. Она будет постепенно обновляться. Первый релиз этой версии состоялся 3 декабря 2015 года — v7.0.0, а последний, на момент написания данной заметки, 4 февраля 2021 года — v7.4.15. Список релизов — php.net/releases/index.php.

Типизация

Это одно из главных нововведений в язык. Объявления типов могут использоваться для аргументов функций, возвращаемых значений и, начиная с PHP 7.4.0, для свойств класса. Документация. Пример:

<?php
 
function square(int $number)
{
    return $number * $number;
}
 
print_r(square(5)); // 25

Появилась возможность помечать основные типы (array, callable, bool, float, int, string, iterable, object, mixed) обнуляемыми, т.е. это обычные типы данных которые могут быть либо собой, либо null. Перед обнуляемым типом необходимо указать вопросительный знак — «?». Пример:

<?php
 
class MyClass
{
}
 
function myPrintR(?MyClass $object)
{
    print_r($object);
}
 
myPrintR(new MyClass());
myPrintR(null);

Стрелочные функции

Стрелочные функции (документация) — это лаконичный вариант анонимный функций (замыканий). Пример:

<?php
 
// ДО
function cube($number){
    return ($number * $number * $number);
}
 
$numbers = [1, 2, 3, 4, 5];
$results = array_map('cube', $numbers);
 
print_r($results);
 
// ПОСЛЕ
$numbers = [1, 2, 3, 4, 5];
$results = array_map(fn($number) => $number * $number * $number, $numbers);
 
// $numbers можно использовать внутри замыкания, он подхватывается автоматически.
 
print_r($results);

Оператор нулевого слияния

Его также называют null-коалесцентный оператор или оператор объединения с null.

<?php
 
// ДО
if (isset($_GET['name'])) {
    $name = $_GET['name'];
} else {
    $name = 'default-name';
}
 
// ДО (ЕЩЕ ОДИН ВАРИАНТ)
$name = isset($_GET['name']) ? $_GET['name'] : 'default-name';
 
// ПОСЛЕ
$name = $_GET['name'] ?? 'default-name';

Оператор «космический корабль»

Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b. Сравнение производится в соответствии с правилами сравнения типов PHP.

Пример:

<?php
 
// Целые числа
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
 
// Числа с плавающей точкой
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

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

Теперь есть возможность создавать одноразовые классы на лету. Работает это аналогично анонимным функциям. Пример:

<?php
 
interface Logger
{
    public function log(string $msg);
}
 
class Application
{
    private Logger $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 . '"';
    }
});
$app->getLogger()->log('Что-то случилось...');

Синтаксис кодирования Unicode

Теперь к любому Unicode-символу можно обращаться по его шестнадцатеричному коду. Таблица кодов. Ведущие нули указывать не обязательно, т.е. при обращении к символу «Ж» можно использовать код «416» или «000416» или даже «0000000416». Пример:

<?php
 
echo "\u{0000000416}" . PHP_EOL;
echo "\u{000416}" . PHP_EOL;
echo "\u{00416}" . PHP_EOL;
echo "\u{0416}" . PHP_EOL;
echo "\u{416}" . PHP_EOL;

Обновлены генераторы

В генераторе теперь можно указывать последнее генерируемое значение и вызывать его извне. Пример:

<?php
 
$generator = (function () {
    yield 1;
    yield 2;
 
    return 3;
})();
 
foreach ($generator as $value) {
    echo $value, PHP_EOL;
}
 
echo $generator->getReturn(), PHP_EOL;

Еще генераторы научились обращаться к другим генераторам внутри себя. Пример:

<?php
 
function generatorFirst()
{
    yield 1;
    yield 2;
    yield from generatorSecond();
}
 
function generatorSecond()
{
    yield 3;
    yield 4;
}
 
foreach (generatorFirst() as $value) {
    echo $value, PHP_EOL;
}

Полезные ссылки

15.01.2020

Категория(-и): PHP, Статьи

#

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