PHP — один из самых простых языков программирования для изучения. С учебным пособием по PHP и правильной мотивацией вы сможете писать свои первые скрипты и запускать команды в течение нескольких часов. В PHP 7 уже реализована сильная оптимизация скорости, что привело к улучшению ранжирования. Теперь язык с открытым исходным кодом получил крупное обновление до версии 8.0. Год спустя следует меньшее обновление до версии 8.1.
- Какие функции появятся в PHP 8.1?
- PHP 8: выпуск в ноябре 2020 г.
- Есть ли сложности со старым кодом?
- Это новые функции PHP 8
- JIT-компилятор
- Типы союзов
- Статический возвращаемый тип
- Слабая карта
- Используйте ::class на объектах
- Строковый интерфейс
- функция fdiv()
- Ошибки типа
- Новая классификация предупреждений двигателя
- Правильные подписи магических методов
- Отражение
Какие функции появятся в PHP 8.1?
PHP 8.1 выпущен в виде бета-версии и в настоящее время проходит тестирование. Финальное обновление последует не раньше ноября 2021 года, но о новых возможностях уже известно. Вас ждут следующие новшества:
- Enum : Так называемое перечисление (перечисления с определенным количеством значений) теперь доступно как тип переменной.
- Fibers : новый тип блока кода Fibers дает вам возможность запускать несколько потоков кода параллельно.
- Массивы : начиная с PHP 7.4 вы можете распаковывать массивы с числовыми значениями. Теперь это возможно и для массивов со строками.
- Только для чтения : свойства класса теперь могут быть помечены как доступные только для чтения и больше не могут быть изменены.
- Пересечение : теперь доступны типы пересечения (в основном противоположные типам объединения).
- Никогда : новое возвращаемое значение «никогда» указывает на то, что функция завершена и не возвращает никакого другого значения.
- Final : теперь вы можете помечать константы класса как «final», чтобы их нельзя было изменить подклассами.
- Fsync : PHP 8.1 представил две функции «fsync» и «fdatasync» для синхронизации данных из буфера на носитель данных.
- Восьмеричная : для отображения восьмеричной системы счисления теперь можно использовать префикс «0o» (ноль и маленькая буква «О») в дополнение к «0» (ноль).
- Globals : использование $GLOBALS было немного ограничено и теперь в некоторых случаях приводит к сообщению об ошибке.
- Null : внутренние функции больше не принимают нулевые значения для необнуляемых аргументов.
PHP 8: выпуск в ноябре 2020 г.
26 ноября 2020 года время пришло: с основным выпуском PHP 8.0.0 была опубликована последняя версия популярного языка сценариев. Это соответствует нормальному трехлетнему циклу для PHP. Предшественник PHP 7.4 ранее был активен примерно год после, например. поддержка PHP 7.1 закончилась. Поддержка PHP 7.2 также прекратилась в конце 2020 года.
Многие веб-сайты, написанные на PHP, все еще полагаются на старые версии. Хотя это в принципе возможно, это не рекомендуется. Поддержание кода веб-сайта в актуальном состоянии и переход на новые версии PHP имеет различные преимущества: новые функции предлагают больше разнообразия, производительность может быть значительно увеличена, а бреши в безопасности закрыты.
Есть ли сложности со старым кодом?
Поскольку PHP 8 является новой основной версией, следует ожидать, что старый код больше не будет совместим. Однако большинство изменений, которые могли привести к осложнениям, уже были объявлены устаревшими в версиях 7.2, 7.3 и 7.4.
Недавние изменения включают в себя:
- Настоящий тип _
- Волшебные цитаты наследия
- array_key_exists() с объектами
- Фильтр FILTER_SANITIZE_MAGIC_QUOTES
- Методы экспорта() отражения
- mb_strrpos() с кодировкой в качестве третьего аргумента
- смесь порядка параметров implode()
- Отвязка $this от нестатических замыканий
- функция hebrevc()
- функция convert_cyr_string()
- функция money_format()
- функция ezmlm_hash()
- функция restore_include_path()
- директива allow_url_include ini
У любого, кто всегда обновлял свой код, вряд ли возникнут проблемы, даже если новое обновление является основным выпуском без изменений, совместимых с предыдущими версиями. Полный список всех изменений можно увидеть на официальной странице проекта PHP .
Это новые функции PHP 8
Новая версия PHP содержит ряд нововведений, которые предлагают веб-разработчикам множество дополнительных возможностей. Ниже мы собрали для вас наиболее важные изменения по сравнению с предыдущими версиями.
JIT-компилятор
Самое большое нововведение — JIT-компилятор, который должен значительно повысить производительность. PHP не компилируется, а интерпретируется построчно. JIT-компилятор (JIT = Just in Time) теперь компилирует части кода во время выполнения и, таким образом, работает очень похоже на кешированную версию кода.
Эта новая функция в PHP 8 уже была впечатляюще протестирована Педро Эскудеро. Он использовал простой скрипт для сравнения версий 5.3, 7.4 и 8 (с JIT и без него). Для этого он запускал скрипт по 100 раз в каждой версии, а затем определял среднее время.
Были получены следующие средние значения:
| Версия | Время в секундах |
|---|---|
| 5.3 | 0.64574003219604 |
| 7.4 | 0.10253500938416 |
| 8 (ohne JIT) | 0.098223924636841 |
| 8 (mit JIT) | 0.053637981414795 |
Хотя переход с версии 7.4 на 8 без JIT не имеет большого значения, разница с версией 8 с JIT значительна. Компилятор JIT обеспечивает повышение производительности более чем на 45 процентов.
Типы союзов
Типы объединения уже известны из других языков, таких как C/C++, TypeScript или Haskell. Здесь два или более типов могут образовывать объединение, и может использоваться любой из именованных типов. В самом коде это может выглядеть так:
Однако есть одна оговорка, посколькуvoid не может быть частью типа объединения, потому что он не возвращает возвращаемое значение. Кроме того, обнуляемые объединения могут использовать |null или? быть написано, как в этом примере
public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;
Статический возвращаемый тип
Static — это специальное имя класса, и в новой версии он становится допустимым типом возвращаемого значения наряду с self и parent.
Слабая карта
WeakRefs уже были добавлены в PHP 7.4, PHP 8 предоставляет расширение этой функции с помощью WeakMaps. WeakMaps и WeakRefs можно использовать для удаления объектов, когда только кеш ссылается на классы сущностей объекта. Это приводит к ресурсосберегающему обращению с объектами. Пример из документации:
class FooBar { private WeakMap $cache; public function getSomethingWithCaching(object $obj) { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } // ... }
Используйте ::class на объектах
В более ранних версиях вам приходилось использовать get_class() для присвоения класса объектам. Теперь вы можете применять ::class к объектам, что упрощает код.
Строковый интерфейс
Интерфейс Stringable автоматически добавляется к классам, реализующим метод __ toString(). Раньше этот шаг приходилось выполнять вручную. В самом коде это выглядит так:
class Foo { public function __toString(): string { return 'foo'; } } function bar(Stringable $stringable) { /* … */ } bar(new Foo()); bar('abc');
функция fdiv()
Деление на 0 разрешено с помощью новой функции fdiv(). Теперь вы получаете INF, -INF или NAN в качестве возвращаемого значения.
Ошибки типа
Ранее только пользовательские функции вызывали TypeErrors, внутренние функции имели предупреждение инульизданный. В PHP 8 большинство внутренних функций также выдают ошибку типа.
Новая классификация предупреждений двигателя
До сих пор было много ошибок, которые давали только предупреждение или подсказку. Теперь это было обновлено. Полный список новых сообщений об ошибках PHP см. в документации.
Правильные подписи магических методов
В предыдущих версиях PHP можно было написать магические методы с сигнатурами, которые не соответствовали ожидаемой сигнатуре, например, __clone(): float или __isset(): closure. С момента появления PHP 7.0 правильность применения магических методов проверялась только случайным образом. В новую версию добавлены различные проверки параметров и возвращаемых значений, чтобы гарантировать правильность подписей.
Отражение
Сигнатуры отражения были изменены. Первоначально Reflection был определен следующим образом:
ReflectionClass::newInstance($args); ReflectionFunction::invoke($args); ReflectionMethod::invoke($object, $args);
В PHP 8 теперь это написано так:
ReflectionClass::newInstance(...$args); ReflectionFunction::invoke(...$args); ReflectionMethod::invoke($object, ...$args);
Для одновременной поддержки PHP 7 и PHP 8 вы можете сформулировать код следующим образом:
ReflectionClass::newInstance($arg = null, ...$args); ReflectionFunction::invoke($arg = null, ...$args); ReflectionMethod::invoke($object, $arg = null, ...$args);








