Найти тему
Сергей Мухин

Что будет нового в PHP 7.4

Оглавление

Предварительная загрузка (Preloading)

Предварительная загрузка - удивительное дополнение к ядру PHP, которое может привести к значительному улучшению производительности.Итак, если вы в своей работе используете какой-либо фреймворк, его файлы должны быть загружены и перекомпилированы при каждом запросе. Предварительная загрузка позволяет серверу загружать PHP-файлы в память при запуске и иметь их постоянно доступными для всех последующих запросов.
Повышение производительности, конечно, связано с затратами: если источник предварительно загруженных файлов изменяется, сервер должен быть перезапущен.

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

Переменные класса могут быть подсказаны типом:

class A {
public string $name;
public Foo $foo;
}

Улучшена разница типов

Разница типов - это тема, достойная отдельного сообщения в блоге ; короче говоря: вы сможете использовать противоречивые типы возврата

class ParentType {
}

class ChildType extends ParentType {
}

class A {
public function covariantReturnTypes(): ParentType { /* … */ }
}

class B extends A {
public function covariantReturnTypes(): ChildType { /* … */ }
}

... и противоречивые аргументы.

class A {
public function contraVariantArguments(ChildType $type) { /* … */ }
}

class B extends A {
public function contraVariantArguments(ParentType $type) { /* … */ }
}

RFC в настоящее время находится на этапе голосования, но, похоже, пройдет без проблем

Интерфейс внешней функции

Интерфейс внешней функции, FFI, позволяет вызывать код C из пользовательского пространства. Это означает, что расширения PHP могут быть написаны на чистом PHP.Следует отметить, что это сложная тема. Вам все еще нужны знания C, чтобы правильно использовать эту функцию.

Оператор присваивания значения NULL

Появится возможность использовать синтаксис "если левый параметр не существует или равен null, присвоить ему значение правого параметра".
Т.е. вместо этого:

$data['date'] = $data['date'] ?? new DateTime();

Вы можете сделать это:

$data['date'] ??= new DateTime();

Пользовательский объект сериализации

В настоящее время PHP предоставляет два механизма для настраиваемой сериализации объектов: методы __sleep()/__wakeup() - Serializable интерфейс. К сожалению, оба подхода имеют проблемы. Этот RFC добавляет два новых магических метода: __serialize и __unserialize, которые позволяют избежать этих проблем

// Returns array containing all the necessary state of the object.
public function __serialize(): array;

// Restores the object state from the given data array.
public function __unserialize(array $data): void;

Использование очень похоже на Serializable интерфейс. С практической точки зрения главное отличие состоит в том, что вместо вызова serialize() внутри Serializable::serialize() вы напрямую возвращаете данные, которые должны быть сериализованы в виде массива. В следующем примере показано, как __serialize()/__unserialize() используются и как они составляются при наследовании:

class A
{
private $prop_a;
public function __serialize(): array
{
return ["prop_a" => $this->prop_a];
}

public function __unserialize(array $data)
{
$this->prop_a = $data["prop_a"];
}
}

class B extends A
{
private $prop_b;
public function __serialize(): array
{
return [ "prop_b" => $this->prop_b, "parent_data" => parent::__serialize(), ];
}

public function __unserialize(array $data)
{
parent::__unserialize($data["parent_data"]);
$this->prop_b = $data["prop_b"];
}

}

Изменились правила голосования

Технически это не обновление, связанное с PHP 7.4, хотя это, безусловно, стоит упомянуть. Правила голосования для RFC были изменены: для принятия RFC требуется 2/3 голосов, чтобы пройти одобрение.

Рефлексия для ссылок

Такие библиотеки как var dumper Symfony, в значительной степени полагаются на API рефлексии для вывода переменной. Раньше не было должной поддержки рефлексии для ссылок, в результате чего эти библиотеки полагались на "велосипеды" для обнаружения ссылок.PHP 7.4 добавляет класс ReflectionReference, который решает эту проблему.

Обновление 02-14: RFC пройден, и изменения подтверждены для PHP 7.4.

Добавлена функция mb_str_split

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

ext-hash всегда включен

Как видно из заголовка, это расширение теперь постоянно доступно во всех установках PHP.

PEAR по умолчанию больше не включен

Поскольку PEAR больше не поддерживается, основная команда решила удалить установку по умолчанию с PHP 7.4.

Реестр хэширования паролей

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

Устареет ext/wwdx

Этот формат обмена данными никогда не был стандартизирован, и теперь его расширение устарело.

Обратно несовместимые изменения

Так же не забываем смотреть на полный документ при обновлении версий PHP.Можно выделить следующие несовместимых назад изменения:

— Ссылка parent:: в классе без родителя вызовет ошибку времени компиляции вместо ошибки времени выполнения.

— var_dump DateTime или DateTimeImmutable больше не будет выводить доступные свойства объекта.openssl_random_pseudo_bytes сгенерирует исключение в ситуациях ошибки.

— Попытка сериализации экземпляров PDO или PDOStatement сгенерирует Exception вместо PDOException.

— Вызов get_object_vars() на ArrayObject экземпляре будет возвращать свойства самого ArrayObject, а не значению обернутого массива или объекта. Обратите внимание, что приведение к массиву (array) на это не влияет.

Статья периодически пополняется в блоге https://sergeymukhin.com/blog/novoe-v-php-74