Статья содержит новые возможности и особенности PHP7. Не все, но наиболее заметные и интересные.

php7

Установка PHP7

Стабильные версии PHP 7 с официального сайта.
Один из вариантов получения сборки PHP7 и его модулей можно — репозиторий fedoraproject.
Быстрый старт
CentOS/RHEL 7.x:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

CentOS/RHEL 6.x:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

Установка PHP 7 mod_php:
yum install php70w php70w-opcache

Установка PHP 7 php-fpm:
yum install php70w-fpm php70w-opcache

Универсальный синтаксис работы с переменными

Одно из заметных нововведений этой версии — это «Универсальный синтаксис работы с переменными» (Uniform Variable Syntax).

Операция с произвольными выражениями:

function get_something(){ return '555'; }
$func_name = 'something';

// php 5
$func_name = 'get_'.$func_name;
echo $func_name(); // 555

Добавлены ранее недоступные операций с переменными:

// php 7
echo ('get_'.$func_name)(); // 555

$foo()['bar']()
[$obj1, $obj2][0]->prop

Это должно упростить обращение к необходимым данным и избавить от промежуточных переменных, но не стоит забывать, что злоупотребляя новым синтаксисом можно запутать код.

Из-за этого нововведения, интерпретатор станет иначе смотреть на некоторые конструкции.
В официальном документе описаны случаи этих интерпретаций. Вот один из них:

$$foo['bar']['baz']; // исходный код

// интерпретатор php 5
// сначала будет получено значение $foo['bar']['baz']
// затем это значение будет использовано в качестве имени переменной для получение результата
${$foo['bar']['baz']};

// интерпретатор php 7
// сначала будет получено значение $foo
// затем это значение будет использовано в качестве имени переменной массива для обращения к элементу ['bar']['baz']
($$foo)['bar']['baz']; 

Теперь такие конструкции необходимо читать «слева-направо», последовательно передавая значение следующему оператору.
Непосредственно это правило позволило существовать таким командам и читать их единственно правильным способом:

$foo()['bar']()

Это непременно необходимо учитывать при переходе на версию PHP 7.

Во всех подобных конструкциях необходимо добавить фигурные скобки, чтобы явно указать интерпретатору, как ему необходимо поступить:

// php 5
$foo = array('bar' => array('baz' => 'ice'));
$ice = 'Холодно';
echo $$foo['bar']['baz'];

// php 7, с изменением команды
$foo = array('bar' => array('baz' => 'ice'));
$ice = 'Холодно';
echo ${$foo['bar']['baz']};

Полезности и интересные факты


Оператор "??"

// php 5
$var = isset($var)?$var:'0';

// php 7
$var = $var??'0';

Объявления возвращаемых типов (функции, методом или замыканием)

string, int, float, bool, array, callable, self (в методах класса), parent (в методах класса), Closure (замыкание), имя класса или имя интерфейса
При попытке функцией вернуть другой тип — будет получена ошибка «Uncaught TypeError».
При наследовании методов нужно соблюдать тип возвращаемых данных родительского метода.

Пример объявления функции с ожидаемым типом:

function return_array(): array{
    return array('Hi!');
}

Типы переменных в определении функций (string, int, float, bool)

// php 7
function echo_number(int $number){
	echo $number;
}

echo_number(123); // выведет 123
echo_number('text'); // при включенном режиме strict выкинет иключение: Uncaught TypeError: Argument 1 passed to echo_number() 

Запрещено создавать классы с именами: `int`, `string`, `float`,`bool`
Кстати именно это и позволило использовать эти типы при объявлении функций

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

$newClass = new class{
    function who_i(){ echo 'Я метод анонимного класса'; }
};

echo $newClass->who_i();

Поддержка юникод управляющих последовательностей
echo "\u{1F427}"; // пингвин, обратите внимание, что кавычки должны быть двойные

Группировка объявлений `use`

// php 5
use some\namespace\ClassA;
use some\namespace\ClassB as B;
 
use function some\namespace\fn_a;
use function some\namespace\fn_b;
 
use const some\namespace\ConstA;
use const some\namespace\ConstB;
 
// php 7 
use some\namespace\{ClassA, ClassB as B};
use function some\namespace\{fn_a, fn_b};
use const some\namespace\{ConstA, ConstB};

Целочисленное деление intdiv()

echo intdiv(7, 2); // 3


Обещают рост производительности, благодаря новому низкоуровнему коду

Комментарии (1)