Основные возможности PHP 7.4.


PHP 7.4 наконец-то вышел несколько дней назад. Это четвертое обновление для серии PHP 7, и оно поставляется с очень интересным набором функций, о которых я собираюсь рассказать в этой статье. Некоторые из них очень запоздалые, такие как распаковка массивов, типизированные свойства и т. Д. Тем не менее, все это идет с некоторыми оговорками. Давайте поговорим обо всех новых функциях в деталях.

Типизированные свойства

Когда PHP впервые был выпущен, он не должен был быть типизированным языком, таким как Java или TypeScript. Но за последние несколько лет поддержка набора текста была добавлена, хотя и постепенно. Типизированные свойства являются частью этого улучшения.

PHP 7.4 теперь поддерживает объявления типов для свойств класса. Например, сделайте следующее:


class User {
    public int $id;
    
    public function __construct()
    {
        $this->id = 10;
    }
}

$user = new User();

Если вы запустите приведенный выше пример на PHP версии <7.4, вы получите следующую фатальную ошибку.

Parse error:  syntax error, unexpected 'int' (T_STRING), 
expecting function (T_FUNCTION) or const (T_CONST) 
in (...)(...) on line 3

PHP выдал фатальную ошибку, так как эти версии не поддерживают типизированные свойства. Теперь, если вы запустите тот же код на PHP 7.4, он будет работать без фатальной ошибки.

Давайте немного изменим приведенный выше пример.


class User {
    public int $id;
    
    public function __construct()
    {
        $this->id = 'php';
    }
}

$user = new User();

Сейчас я присваиваю строку свойству, которое изначально объявлено как целое число. Если вы запустите приведенный выше пример на PHP 7.4, вы получите следующую фатальную ошибку.

Fatal error:  Uncaught TypeError: Typed property 
User::$id must be int, string used in (...)(...):7

Это то, на что способны типизированные свойства. Теперь разработчики не должны сами писать проверки типов. Язык теперь делает это для них. Но есть некоторые предостережения в этой реализации. Давай поговорим об этом.


class User {
    public int $id = '10';
    
    public function __construct()
    {
        $this->id = 10;
    }
}

$user = new User();

Как вы можете видеть, теперь я назначаю строковое значение по умолчанию $id свойство, которое является целым числом. Как и следовало ожидать, PHP должен выдать фатальную ошибку. И это так. Он вернет следующую ошибку при запуске вышеуказанного кода.

Fatal error:  Default value for property of type int 
can only be int in (...)(...) on line 3

Но все становится странным, если немного изменить вышеприведенный код.


class User {
    public int $id = 10;
    
    public function __construct()
    {
        $this->id = '10';
    }
}

$user = new User();

Теперь я назначаю целочисленное значение по умолчанию (10) $id это нормально. Но теперь я назначаю строковое значение $id в конструкторе. Вы ожидаете, что PHP выдаст ошибку в этом случае. Но ты не прав. PHP выполняет этот кусок кода без каких-либо хлопот, без каких-либо ошибок или предупреждений. Зачем? Потому что это может быть ограничением этой реализации. PHP может подумать 10 эквивалентно "10" когда дело доходит до назначения его из метода класса. Это предостережение, с которым нужно быть осторожным.

Распаковка внутри массивов

Если вы когда-либо работали с JavaScript, возможно, вам хорошо известна эта функция. Таким образом, с PHP 7.4 вы можете распаковать массивы в другой массив с помощью оператора распространения (...).

До PHP 7.4, если вы хотите объединить два массива, вам нужно использовать такие методы, как array_merge, Возьми это к примеру.


// Pre PHP 7.4

$array = ('foo', 'bar');

$result = array_merge($array, ('baz'));

print_r($result);
// Array((0) => baz (1) => foo (2) => bar)

Но из PHP 7.4 вы можете достичь выше, используя следующий синтаксис:


// FRom PHP 7.4

$array = ('foo', 'bar');

$result = ('baz', ...$array);

print_r($result);
// Array((0) => baz (1) => foo (2) => bar)

Вы даже можете распаковать несколько массивов в один массив, что невозможно при использовании таких методов, как array_merge,

Нулевой объединяющий оператор присваивания (??)

PHP ввел новый оператор, называемый оператором слияния Null (??), который можно использовать для сценариев, в которых необходимо проверить, установлена ​​ли переменная или нет, прежде чем присваивать ее другой переменной. Например, проверьте это.


// Pre PHP 7.4

$user = (
    'name' => 'Amit', 
    'job' => 'Developer'
);


if (!isset($user('job'))) {
    $user('job') = 'Blogger'; 
}

print_r($user);
//Array((name) => Amit (job) => Developer)

Приведенный выше код кода можно сократить до следующего в PHP 7.4 с помощью оператора присваивания null coalescing.


// From PHP 7.4

$user = (
    'name' => 'Amit'
);

$user('job') ??= 'Blogger'; 

print_r($user);
//Array((name) => Amit (job) => Blogger)

Как вы можете видеть, теперь нужно выполнить только одну строку, когда вам нужно выполнить что-то, как описано выше. Довольно аккуратно, правда?

Функции стрелок

Эта особенность также основана на аналогичной функции из JavaScript. Да! Это стрелки. В PHP В заключение. Теперь вы можете использовать сокращенный синтаксис для определения функций с неявной привязкой области действия по значению.

Давайте разберемся в этом, взяв примеры до и после PHP 7.4.


// Pre PHP 7.4

$factor = 10;

$numbers = array_map(function($value) use ($factor){
    return $value * $factor;
}, (1, 2, 3));

print_r($numbers);
//Array((0) => 10 (1) => 20 (2) => 30)

Как вы можете видеть, в приведенном выше примере, если вы хотите использовать функции более высокого порядка, такие как array_map, будет анонимная функция, которая будет оценивать значения из массива, переданного в качестве второго аргумента, и если вы хотите использовать переменную, которая находится вне области действия анонимной функции, вам нужно будет добавить use, Это много стандартного кода, верно?

Начиная с PHP 7.4, выше можно сократить до следующего, используя синтаксис жирной стрелки (=>).


// From PHP 7.4

$factor = 10;

$numbers = array_map(fn($value) => $value * $factor, (1, 2, 3));

print_r($numbers);
//Array((0) => 10 (1) => 20 (2) => 30)

Весь код теперь сокращен до одной строки. Теперь стало более читабельным и чистым.

В заключение

Это были все горячие новые возможности PHP 7.4, объясненные со всеми его плюсами и предостережениями. Надеюсь, вам понравилась статья так же, как я любил ее писать. До скорого!