Переменные типа union могут принимать значения нескольких различных типов. Это позволяет передавать в функцию аргументы с учетом имени, а не позиции параметра. Таким образом, аргументы становятся самодокументируемыми, не зависящими от порядка расположения и обеспечивающими возможность произвольного исключения значений, передаваемых по умолчанию.
Хотя PHP и раньше поддерживал два специальных типа union (Type или Null и массив или Traversable), произвольные объединения языком не поддерживались. Вместо этого использовались аннотации phpdoc. Объединения оставались самым крупным пробелом в системе типов PHP.
Поддержка типа union позволяет перемещать больше информации о типах из phpdoc в сигнатуры функций, что позволяет их актуализировать, снижая вероятность устаревания сведений о типах. Типы проверяются во время наследования и доступны через отражение. Синтаксис здесь не такой объемный, как в phpdoc.
После выпуска релиза 26 ноября у языка остается пять кандидатов в релизы. Версию PHP 8.0 можно загрузить с сайта php.net. Среди других ключевых особенностей PHP 8.0 следует выделить следующие:
— Доступны две технологии JIT-компиляции: Tracing JIT и Function JIT. Трассировка JIT показывает примерно в три раза более высокую производительность на синтетических бенчмарках и 1,5-2-кратное ее увеличение в некоторых длительно работающих приложениях. Типичная производительность приложений находится на одном уровне с PHP 7.4.
— Подобно аннотациям в Java и атрибутам в C# и Rust, атрибуты в PHP представляют собой форму структурированных синтаксических метаданных для объявлений классов, констант, функций, методов, параметров и свойств.
— Именованные аргументы обеспечивают передачу аргументов функции исходя из имени параметра, а не его позиции. Смысл, заложенный в аргумент, становится самодокументируемым, а сами аргументы не зависят от порядка их передачи, что позволяет произвольно исключать значения, передаваемые по умолчанию.
— Слабые карты (weak maps) помогают формировать связи между объектами и произвольными значениями. При этом объекты, используемые в качестве ключей, не препятствуют сборке мусора. Если ключ объекта удален сборщиком мусора, он будет удален и из карты. В общем случае идея использования слабых карт заключается в том, чтобы связать данные с отдельными экземплярами объектов, если их последующее сохранение не требуется. При этом происходит эффективная очистка памяти в длительных процессах.
— Поддержка свойств конструктора вводит сокращенный синтаксис определения свойств прямо в конструкторе. Это значительно упрощает ситуацию, когда описание простых свойств требует большого объема кода, поскольку ранее все свойства приходилось повторять по крайней мере четыре раза.
— Добавлена также функция сравнения, аналогичная оператору switch, но имеющая более безопасную семантику и поддерживающая возможность возврата значений.
Версия PHP 8.0 пришла на смену версии PHP 7, дебютировавшей в декабре 2015 года.