Поиск по сайту:

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


PHP 8.1 был выпущен в ноябре 2021 года как последняя дополнительная версия языка PHP. Он добавляет несколько новых языковых функций, а также небольшие улучшения и улучшения производительности. Есть несколько критических изменений, о которых нужно знать, но большинство обновлений с PHP 8.0 должны быть простыми.

Новые возможности

Обновление PHP этого года добавляет несколько новых функций для повышения производительности труда разработчиков. Вот что вы сможете использовать после обновления.

перечисления

Типы Enum, наконец, стали частью языка PHP. Они позволяют указать, что значение должно быть одной из предопределенных констант.

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

# PHP 8.0
class PostStatus {
    const Draft = 1;
    const Published = 2;
}
 
# PHP 8.0 - Cannot typehint that the value 
#           of `$PostStatus` must be defined 
#           within `PostStatus`.
class Post {
    public function __construct(
        public string $Headline,
        public int $PostStatus) {}
}
 
# PHP 8.1
enum PostStatus {
    case Draft = 1;
    case Published = 2;
}
 
# PHP 8.1 - Now it's impossible to pass an 
#           invalid value as the status.
class Post {
    public function __construct(
        public string $Headline,
        public PostStatus $PostStatus) {}
}

Свойства только для чтения

Новое ключевое слово readonly помечает свойство класса как неизменяемое. Свойства только для чтения могут быть записаны только один раз. Попытка изменить их значение после инициализации вызовет ошибку.

Это упрощает создание простых неизменяемых объектов значений. Раньше вам нужно было добавлять в класс повторяющиеся методы, если вы хотели предоставить значения свойств, не допуская модификации. Теперь вы можете сделать свойства public без риска непреднамеренных изменений.

# PHP 8.0 - This quickly becomes repetitive!
class Post {
    public function __construct(
        protected string $Headline) {}
 
    public function getHeadline() : string {
        return $this -> Headline;
    }
}
 
# PHP 8.1
class Post {
    public function __construct(
        public readonly string $Headline) {}
}

Типы пересечений

Система типов PHP теперь понимает пересечения. Они позволяют указать, что значение должно реализовывать несколько интерфейсов.

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

Пересечения определяются путем объединения двух или более типов с символом амперсанда. Они добавляют больше гибкости системе типов после введения типов объединения в PHP 8.0. Одно предостережение: в настоящее время вы не можете использовать типы пересечения и объединения вместе — использование Countable&Stringable|CustomType в этом выпуске запрещено.

# PHP 8.0
interface CountableString extends Countable, Stringable {}
 
public function countAndReport(CountableString $value) : void {
    echo "$value: " . count($value);
}
 
# PHP 8.1
public function countAndReport(Countable&Stringable $value) : void {
    echo "$value: " . count($value);
}

Волокна

Волокна — это механизм, облегчающий параллельное выполнение. Они упрощают реализацию возобновляемых блоков кода, которые можно приостановить в любом месте стека.

API Fibers относительно низкоуровневый. Не ожидается, что разработчики конечных пользователей будут взаимодействовать с ним на регулярной основе. Вместо этого Fibers будут интегрированы в библиотеки, предлагающие асинхронные API и реализации событийного цикла. Это система потока управления, которая позволяет упростить абстракции более высокого уровня.

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

# PHP 8.0 - A promise-based HTTP client
$response = $httpClient -> request("http://example.com")
    -> then(function (Response $Response) {
        return $Response -> getBody();
    });
print $response;
 
# PHP 8.1 - An HTTP client using Fibers internally
$response = $httpClient -> request("https://example.com");
print $response -> getBody();

Первоклассные вызываемые объекты

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

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

# PHP 8.0
$builtin = Closure::fromCallable("array_filter");
$method = [$this, "getData"];
 
# PHP 8.1
$builtin = array_filter(...);
$method = $this -> getData(...);

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

Использование инициализаторов New In

Еще одна новая функция — это ключевое слово new в инициализаторах. Теперь вы можете использовать экземпляры объектов в качестве значений параметров по умолчанию:

# PHP 8.0
class SendNewsletterAction {
    protected Mailer $Mailer;
    public function __construct(?Mailer $Mailer=null) {
        $this -> Mailer = $Mailer ?? new SmtpMailer();
    }
}
 
# PHP 8.1
class SendNewsletterAction {
    public function __construct(
        protected readonly Mailer $Mailer=new SmtpMailer()) {}
}

Ключевое слово new также работает со статическими переменными, глобальными константами и аргументами атрибутов. Это дает вам больше гибкости и удобства, когда вы хотите, чтобы экземпляр объекта был значением по умолчанию.

Окончательные константы класса

Ключевое слово final теперь поддерживается для констант класса. Вы можете пометить отдельные константы как final, не запечатывая весь класс. Раньше дочерние классы могли перезаписывать значения констант, унаследованных от родителей.

# PHP 8.0 - Cannot disallow this without 
#           making the whole class `final`
class DemoClass {
    public const DemoConstant = 1;
}
class ChildClass extends DemoClass {
    public const DemoConstant = 2;
}
 
# PHP 8.1 - Just the constant can be `final`.
class DemoClass {
    final public const DemoConstant = 1;
}
class ChildClass extends DemoClass {
    // Raises a fatal error
    public const DemoConstant = 2;
}

Другие

Помимо перечисленных выше важных элементов, в PHP 8.1 также добавлено несколько удобных функций, которые помогают сделать код более самодокументируемым. Вы можете записывать восьмеричные числа в явном виде, например 0o14, и использовать новый тип возвращаемого значения never для обозначения функций, которые вызовут исключение или закроют текущий скрипт. Это помогает информировать об обнаружении мертвого кода в программном обеспечении для статического анализа.

В стандартной библиотеке есть несколько новых функций. array_is_list() позволяет проверить, является ли массив списком ([\foo\, \bar\]) или ассоциативным ([\ foo\ => \bar\]), обеспечивающий встроенную реализацию функции, которая обычно встречается в существующем пользовательском коде. fsync() и fdatasync() позволяют синхронизировать изменения указателя файла с базовым носителем данных. Также была добавлена поддержка Sodium для алгоритмов хеширования XChaCha20 и Ristretto255.

Наконец, в этом выпуске есть перспективы улучшения производительности. Оптимизации, включая кеш наследования классов, могут обеспечить бесплатное повышение производительности до 8%. Это было бы наиболее заметно в сильно объектно-ориентированных кодовых базах со многими отношениями родитель-потомок. Теперь PHP будет кэшировать эти ссылки, чтобы не перестраивать их постоянно.

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

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

  • Перезапись массива $_GLOBALS больше не допускается. Вы по-прежнему можете записывать отдельные ключи, но не можете переназначать сам $_GLOBALS.
  • Если вы расширяете встроенный класс, ваши переопределенные методы должны объявлять возвращаемый тип, совместимый с исходным. Если вы укажете несовместимый тип, будет выдано предупреждение об устаревании. Атрибут #[ReturnTypeWillChange] в настоящее время поддерживается как способ избежать этого для библиотек, которым необходимо поддерживать несколько версий PHP.
  • Передача null в ненулевые параметры внутренних функций устарела. Раньше это было разрешено, но противоречило принудительному использованию подсказок типа для пользовательских функций.
  • Неявное приведение от int к float устарело. Это влияет на такие сценарии, как $array[10.1], где мантисса будет потеряны, так как массивы должны иметь целочисленные ключи.
  • В рамках текущей работы PHP по удалению типов resource несколько групп функций теперь работают с новыми объектами вместо ресурсов. Эти изменения относятся к API FileInfo, FTP, IMAP, LDAP, PgSQL и PSpell.
  • Функции, которые работают с объектами HTML, такими как htmlspecialchars() и htmlentities(), теперь по умолчанию не содержат апострофов, поэтому станет '.
  • Прямой вызов статических методов для трейтов не рекомендуется; вместо этого вы должны вызвать метод для класса, который использует трейт.

Другие удаления и устаревания затрагивают отдельные API, включая PDO, MySQLi и Standard. Вы должны просмотреть все руководство по миграции, прежде чем обновлять свой проект.

В совокупности изменения этого цикла довольно безобидны. Кодовые базы, которые уже были совместимы с современными передовыми практиками PHP, не должны испытывать слишком много проблем при переходе на 8.1. Популярные фреймворки, включая Symfony и Laravel, уже поддерживают PHP 8.1.

Заключение

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

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




Все права защищены. © Linux-Console.net • 2019-2024