Статья
Новые возможности PHP 7

Новые возможности PHP 7

1 июля 2017

1) Объявление скалярных типов

Возможны 2 варианта:
- нестрогая типизация (по умолчанию, автоматическое приведение значений несоответствующих типов к требуемому);
- строгая типизация (в случае передачи значения с типом, отличным от указанного, возбуждается исключение TypeError).

Для объявления типов можно использовать строки (string), целые (int), рациональные числа (float) и логические значения (bool).

function test(int $a, int $b)
{
    return $a + $b;
}

echo test('5', 4);

Результат выполнения:

9

Для включения строгой типизации необходимо добавить директиву declare(strict_types=1) в начало файла (директива работает только на уровне файла, в котором объявлена).

declare(strict_types=1);

function test(int $a, int $b)
{
    return $a + $b;
}

echo test('5', 4);

Результат выполнения:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type integer, string given

 

2) Объявление типа возвращаемого значения

function test(int $a, int $b): float
{
    return $a + $b;
}

var_dump(test(5, 4));

Результат выполнения:

float(9)

Включим строгий режим

declare(strict_types=1);

function test($a, $b): int
{
    return $a + $b;
}

var_dump(test(5.2, 4.3));

Результат выполнения:

Fatal error: Uncaught TypeError: Return value of test() must be of the type integer, float returned

 

3) Оператор "космический корабль"

Сравнивает два выражения, возвращая 1, 0, -1 в случаях когда первый оператор, соответственно больше, равен или меньше второго.

echo 5 <=> 3;
echo 4.6 <=> 8;
echo 5 <=> 5;
echo "d" <=> "a";
echo "b" <=> "x";

Результаты выполнения:

 1
-1
 0
 1
-1

 

4) Оператор объединения со значением null

// PHP 5.6
$param = isset($_GET['param']) ? $_GET['param'] : 'my value';

// PHP 7.0
$param = $_GET['param'] ?? 'my value';

 

5) Объявление массива как константы

// PHP 5.6
const CATS = ['Black cat', 'White cat', 'Ginger cat'];

// PHP 7.0
define('CATS', ['Black cat', 'White cat', 'Ginger cat']);

 

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

Используются для быстрого создания одноразовых объектов.

// PHP 5.6
class Logger
{
    public function log($message)
    {
        echo $message;
    }
}

$loggerObj = new Logger();


// PHP 7.0
$loggerObj = new class {
    public function log($message)
    {
        echo $message;
    }
};

 

7) Группировка use

// PHP 5.6
use app\classes\FirstClass;
use app\classes\SecondClass;
use app\classes\ThirdClass as Third;

// PHP 7.0
use app\classes\{FirstClass, SecondClass, ThirdClass as Third};

 

8) Целочисленное деление

var_dump(intdiv(15, 4));

Результат выполнения:

int(3)

 

9) Фильтрация классов в unserialize()

Стало возможно создать "белый список" разрешенных классов для десериализации.

// Разрешаем все классы (стандартное поведение без указания параметра allowed_classes)
$obj = unserialize($serializedObj, ["allowed_classes" => true]);

// Запрещаем все классы
$obj = unserialize($serializedObj, ["allowed_classes" => false]);

// Разрешаем только объект ExampleClass
$obj = unserialize($serializedObj, ["allowed_classes" => ["ExampleClass"]]);

 

10) Возврат последнего значения в генераторах

Стало возможным использовать оператор return для возврата финального значения, после того, как генератор вернул все сгенерированные значения.

$generator = (function() {
    yield 'one';
    yield 'two';
    return 'end';
})();

foreach ($generator as $value) {
    echo $value;
}

echo $generator->getReturn();

Результат выполнения:

one
two
end

 

11) Делегирование в генераторе

Добавлена возможность передавать генераторам другие генераторы, traversable объекты, массивы, используя yield from.

function generator1()
{
    yield 'Generator 1 - first iteration';
    yield 'Generator 1 - second iteration';
    yield from generator2();
}

function generator2()
{
    yield 'Generator 2 - first iteration';
    yield 'Generator 2 - second iteration';
}

foreach (generator1() as $value)
{
    echo $val;
}

Результат выполнения:

Generator 1 - first iteration
Generator 1 - second iteration
Generator 2 - first iteration
Generator 2 - second iteration



Источники:

http://php.net/manual/ru/migration70.new-features.php