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

Прошло уже почти 2 года после того, как состоялся официальный релиз PHP 7 ( 3 декабря 2015 года. Версия получила маркировку PHP 7.0.0 ) а я, как обычно, только начал интересоваться темой. Что поделаешь, такой уж я есть. Все-таки я еще не видел ни одного сервера с рабочим PHP v7, и по работе последнее время использовал только PHP 5.6. Но, наконец, настал тот час, когда настало время задуматься о подготовке плацдарма в виде знаний для перехода на следующую версию. Итак, что же нового или другого будет в PHP 7, чего не было в более ранних версиях:

Группировка оператора use

До PHPv7:

use Framework\Module\Foo;
use Framework\Module\Bar;
use Framework\Module\Baz;

C PHPv7:

use Framework\Module\{Foo, Bar, Baz};

Более лаконично и просто можно перечислять объявление используемых пространств имен.

Комбинирование операторов сравнения

Это новый оператор <=>, называется spaceship (космический корабль по-нашему). Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b.

До PHPv7:

if ($a < $b) echo -1;

if ($a = $b) echo 0;

if ($a > $b) echo 1;

C PHPv7:

a <=> b

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

// Целые
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

Ожидания

Это то, что в оригинальной терминологии именуется как Expectations. Это улучшенная, обратно совместимая версия старой функции assert().

Пример:

void assert (mixed $expression [, string|Exception $message]);
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Error in code'));

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

Fatal error: Uncaught CustomError: Some error message

Функция целочисленного деления intdiv()

Новая функция intdiv() производит целочисленное деление операндов и возвращает его результат.

Пример:

var_dump(intdiv(10, 3)); // int(3)

Оператор ??

?? - это оператор объединения с null, необходимый для достаточно распространенного действия, когда совместно используются тернарный оператор и функция isset(). Он возвращает первый операнд, если он задан и не равен NULL, а в обратном случае возвращает второй операнд.

До PHPv7:

$route = isset($_GET['route']) ? $_GET['route'] : 'index';

C PHPv7:

$route = $_GET['route'] ?? 'index';

Можно использовать в цепочке, теоретически, бесконечной:

$route = $_GET['route'] ?? CONST_DEFAULT_URL ?? 'index';

Декларация скалярных типов

Это то, что в оригинальной терминологии именуется как Scalar types.

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

C PHPv7:

function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
 
var_dump(sumOfInts(2, '3', 4.1)); // int(9)

Для установки строгого режима, в самом начале файла необходимо поместить одну директиву declare. Это означает, что строгость декларации работает на уровне файла и не затрагивает весь остальной код. Эта директива затрагивает не только декларацию параметров, но и возвращаемые значения функций.

declare(strict_types=1);
 
function multiply(float $x, float $y)
{
    return $x * $y;
}
 
function add(int $x, int $y)
{
    return $x + $y;
}
 
var_dump(multiply(2, 3.5));
// float(7)

var_dump(add('2', 3));
// Fatal error: Uncaught TypeError: Argument 1 passed to add() 
//must be of the type integer, string given...

Возврат значений

Это то, что в оригинальной терминологии именуется как Return Types. Аналогично как и декларация скалярных типов, декларация типа возвращаемого значения указывает, значение какого типа должна вернуть функция.

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
)

При использовании наследования в классах дочерние методы методов должны соответствовать типам объявлений, указанным в родительском классе / интерфейсе:

class A {}
class B extends A {}
 
class C
{
    public function test() : A
    {
        return new A;
    }
}
 
class D extends C
{
    // overriding method C::test() : A
    public function test() : B // Fatal error due to variance mismatch
    {
        return new B;
    }
}

Return:

class A {}
 
interface SomeInterface
{
    public function test() : A;
}
 
class B implements SomeInterface
{
    public function test() : A // Окей
    {
        return null;
        // Fatal error: Uncaught TypeError: Return value of B::test() must be an instance of A, null returned...
    }
}

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

Добавлена поддержка анонимных классов с помощью new class. Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный класс, а потом его объект не имеет смысла:

До PHPv7:

class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}
$util->setLogger(new Logger());

C PHPv7:

$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});

Метод Call

Является более производительным и коротким способом временного связывания области действия объекта с замыканием и его вызовом.

До PHPv7:

$getXCB = function() {return $this->x;};

$getX = $getXCB->bindTo(new A, 'A'); // биндим А к лямбде

echo $getX(); // 1

C PHPv7:

$getX = function() {return $this->x;};

echo $getX->call(new A); // 1

Пока что это весь список, что может пригодиться. Если хотите что-то добавить, пишите в комментариях. За помощь в составлении материала большое спасибо Stanislav Vitvickiy.

Понятно, что нововведений в PHP 7 уже гораздо больше. Я здесь описал те нюансы, на которые обратил внимание в первую очередь.

Информация
Автор webmancer Нравится 0
Рейтинг 1 Не нравится 0
Голосов 1 Прочитали 1
Дата 2017-03-24 09:00:00 В избранном 0
Ваша реакция

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

Зарегистрироваться

Авторизоваться

На рекомендательном сервисе WEBmancer.Org только зарегистрированные пользователи могут комментировать и оставлять рецензии. Авторизованный пользователь так же может ставить отметки книгам, фильмам и другим постам. Вести учет прочитанных книг и просмотренных фильмов. Добавлять посты в избранное и иметь к ним быстрый доступ.