Новые возможности PHP 7
3 апреля 20181) Объявление скалярных типов
Возможны 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