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

8 лучших новых функций в PHP 8


PHP 8 был выпущен в конце ноября 2020 года. Это основная новая версия, которая обновляет язык дополнительными функциями и улучшениями производительности.

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

1. Атрибуты

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

Атрибуты определяются как простые классы, сами аннотированные встроенным в PHP атрибутом Attribute:

#[Attribute]
class CloudSavvyAttribute {
 
    protected string $value;
 
    public function __construct(string $value) {
        $this ->; value = $value;
    }
 
    public function getValue() : string {
        return $this ->; value;
    }
 
}

Затем их можно прикрепить к сущностям в вашей кодовой базе:

#[CloudSavvyAttribute("Example")]
class CloudSavvyClass {
    // ...
}

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

2. Именованные аргументы

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

function foo(?string $a=null, ?string $b=null, ?string $c=null) : void;

В PHP 7 для вызова указанной выше функции при передаче значения \demo\ в $c требовался следующий вызов:

foo(null, null, "demo");

Вместо этого в PHP 8 можно использовать следующий синтаксис:

foo(c: "demo");

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

3. Продвижение недвижимости конструктора

Заполнение свойств класса начальными значениями — одна из наиболее частых ролей конструктора. Код, подобный следующему, является обычным в кодовых базах PHP 7:

class Example {
 
    protected ?string $Property;
 
    public function __construct(?string $Property=null) {
        $this ->; Property = $Property;
    }
 
}

В PHP 8 добавлена поддержка Constructor Property Promotion, сокращенный синтаксис, который позволяет вам комбинировать определение свойства, подсказки типов и заполнение, встроенные в сигнатуру конструктора. Приведенный выше пример можно было бы переписать следующим образом:

class Example {
    public function __construct(
        protected string $Property=null
    )
}

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

4. Типы союзов

Система типов PHP продолжает развиваться с выходом PHP 8. Теперь можно указывать типы как «объединение» двух или более типов, где значение типа может быть получено из любого из типов в объединении.

public function foo(string|int $bar) : int|float;

В придуманном выше примере функция foo() принимает как строки, так и целые числа. Он вернет либо целое число, либо число с плавающей запятой.

На практике эта возможность, вероятно, будет наиболее полезной при применении к свойствам и параметрам метода — хорошим тоном будет принимать различные типы входных данных и нормализовать их к четко определенному единственному выходному типу.

5. Подбери выражение

Новое выражение match — более лаконичная и безопасная альтернатива хорошо известному switch. Он не требует использования операторов case и break, поддерживает комбинированные условия и возвращает значение вместо ввода нового блока кода. Приведение типов отключено, поэтому 1.0 (с плавающей запятой) не считается эквивалентным \1.0\ (строка), в отличие от использования switch.

Вот типичный переключатель PHP 7:

switch (1.0) {
    case 1.0:
        $result = "Float!";
        break;
    case "foo":
    case "bar":
        $result = "foobar!";
        break;
}

И вот как тот же код мог бы выглядеть с PHP 8:

$result = match (1.0) {
    1.0 =>; "Float!",
    "foo", "bar" =>; "foobar!"
}

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

6. Оператор «Nullsafe»

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

В PHP 7:

$photo = null;
if ($user !== null) {
    if ($user ->; profile !== null) {
        if ($user ->; profile ->; getPhoto() !== null) {
            $photo = $user ->; profile ->; getPhoto() ->; getPath();
        }
    }
}

И в PHP 8:

$photo = $user? ->; profile? ->; getPhoto()? ->; getPath();

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

7. Более строгая система типов

Мы уже рассмотрели, как Union Types добавляет еще один уровень гибкости в систему типов PHP 8. Ряд дополнительных изменений в этой области повышает строгость и согласованность проверки типов.

Сравнение строк с числами теперь более разумно. 0 (целое число) больше не эквивалентно \\ (пустая строка) и сравнениям, таким как 123 == \123abc\ теперь оценка false, а не true. Эти изменения помогают уменьшить вероятность ошибок сравнения в вашей кодовой базе, хотя может потребоваться некоторая работа, чтобы обеспечить совместимость старых проектов.

Система типов также получила явный тип mixed (чтобы указать, что любое значение совместимо), а также возвращаемый тип static (поддерживающий позднее статическое связывание). В других местах сигнатуры абстрактных методов в типажах теперь проверяются правильно.

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

8. ТОЧНО

Последняя запись в нашем списке — это скорее закулисная возможность, а не языковая функция. В PHP 8 добавлена поддержка компиляции Just-In-Time, которая может значительно повысить производительность.

JIT-компиляция, скорее всего, принесет пользу длительным сценариям с повторяющимися задачами. Тесты показывают, что улучшение будет менее заметным в веб-приложениях, где чаще всего встречается PHP. Однако добавление JIT может помочь PHP расшириться в другие области программирования, повысив общую привлекательность и универсальность языка.

JIT должен быть включен с помощью новых настроек в файле конфигурации php.ini. Подробное руководство по доступным значениям и их эффектам можно найти в документации; однако в качестве общего значения по умолчанию рекомендуется следующее:

<code>opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=1255</code>

Заключение

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

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




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