Основные изменения в версиях PHP

15 Декабря 2024 (ред)

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

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

PHP 8.4

Хуки свойств. Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения. Дополнительную логику добавляют через хук get, который срабатывает при чтении свойства, и хук set, который срабатывает при записи значения в свойство объекта. Хуки свойств сокращают логику написания отдельных методов получения и установки свойств, перенося эту функциональность в сами свойства. Подробнее в документации.

Асимметричная видимость свойств объектов. Видимостью свойств объектов для операций записи значения — set теперь разрешили управлять отдельно от видимости свойств для операций чтения — get. Поэтому, если увидите строку в коде наподобие этой public protected(set) string $name; — здесь ошибки нет, а как раз таки применяется ассиметричная видимость (public для чтения и protected для изменения) использования значения свойства. Про видимость свойств в документации.

Ленивые объекты. Начиная с PHP 8.4 теперь можно создавать "ленивые" объекты, инициализация которых откладывается до обращения к объекту. Такое новвоведение больше пригодиться разработчикам фреймворков и библиотек, но упомянуть его стоит. Ссылка на документацию.

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

Полный перечень изменений для PHP 8.4

PHP 8.3

Типизированные константы класса. Константы классов, интерфейсов, трейтов и константы перечислений поддерживают объявления типов.

Атрибут Override. Добавлен атрибут #[\Override], который проверяет существование метода в родительском классе или в реализуемом интерфейсе. Если родительский метод будет удалён или иным образом переопределение станет невозможно, будет выброшена ошибка.

Получение констант классов динамическим синтаксисом. Стало возможным получить доступ к константам классов через переменные вида C::{$name}.

Полный перечень изменений для PHP 8.3

PHP 8.2

Атрибут SensitiveParameter. Добавлен атрибут #[\SensitiveParameter] для редактирования конфиденциальных данных в трассировках стека вызовов. Проще говоря, помеченные этим атрибутом данные не будут выведены в ошибке или в лог в составе текста ошибки.

Улучшения системы типов. Новый тип true и также стало возможным использовать null и false как самостоятельные типы и комбинировать пересечение и объединение типов по принципу DNF.

Константы в трейтах. В трейтах разрешили использовать константы.

Классы, доступные только для чтения. Теперь можно не указывать readonly для каждого свойства, а объявить весь класс readonly.

Полный перечень изменений для PHP 8.2

PHP 8.1

Улучшение распаковки массива. Теперь можно распаковать массив при помощи ...$array со строковыми ключами.

Перечисления (Enums). В PHP 8.1 добавлены перечисления enum. Enum — это тип для перечисления, который имеет фиксированное количество возможных значений

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

Пересечение типов. Пересечение типов принимает значения, которые удовлетворяют не одному, а одновременно нескольким объявлениям класс-типов. Отдельные пересекающиеся типы соединяются символом &. Поэтому пересечение типов T, U и V записывается как T&U&V (все включены). Не путать с объединением типов, вида T|U|V (один из).

Тип never. Добавлен новый тип возвращаемого значения never. Тип указывает на то, что функция либо вызывает exit(), либо выбрасывает исключение, либо не завершается.

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

Readonly-свойства. Начиная с PHP 8.1.0 возможно объявлять свойства с модификатором readonly, который запрещает изменять свойство после инициализации, проще говоря, оно должно быть установлено только в конструкторе класса.

Модификатор final для констант класса. Теперь константы в классе могут быть обозначены конечными и не переопределяться в наследуемых классах (ошибка при попытке переопределения). Константы интерфейса по умолчанию становятся переопределяемыми.

Полный перечень изменений для PHP 8.1

PHP 8.0

Именованные аргументы. Именованные аргументы передаются в функцию на основе имени, а не позиции параметра. Назначение аргумента документирует само себя, аргументы перестают зависеть от порядка, в котором передаются, и разрешается произвольно пропускать значения по умолчанию. Например setcookie("Test", $value, domain: "example.com"); Подробнее в документации.

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

Объявление свойств в конструкторе. В PHP 8.0 появилась возможность объявлять свойства класса в аргументах конструктора. Это уменьшает кол-во кода, так как ранее это свойство нужно было объявить в классе, а затем передать его значение из аргумента конструктора. Теперь это назначение можно сделать сразу в сигнатуре конструктора. Ссылка на подробности.

Объединение типов. Стало возможным указывать несколько типов при помощи объединения типов. Примечание: В версиях до PHP 8.0 вы могли объявить только один тип для свойств, параметров и возвращаемых типов. PHP 7.1 и более поздние версии имеют типы, допускающие значение null, что означает, что вы можете объявить тип с помощью null объявления типа, аналогичного ?string.

Выражение Match. Как замена устаревающего switсh появилось выражение match, но в отличие от инструкции switch, выражение сопоставления оценивает значение в стиле, который больше похож на тернарный оператор. Выражение выполняет строгое сравнение ===, а не слабую проверку на равенство ==, как это делает инструкция switch.

Оператор Nullsafe. Оператор nullsafe разрешает безопасно обращаться к свойствам и методам, значение которых равно null через конструкцию ?->. В этом случае в последовательности вызовов будет прерывание с возвратом null.

Вариативный аргумент функции. Любое количество параметров функции теперь может быть заменено вариативным аргументом, например как ...$arguments.

Возвращаемый тип static. static (как в позднем статическом связывании) теперь можно использовать как возвращаемый тип.

Полный перечень изменений для PHP 8.0

PHP 7.4

Типизированные свойства. Свойства класса стали поддерживать объявления типов.

Стрелочные функции. Стрелочные функции как упрощенный вариант написания для анонимных функций. Имеют вид $fn = fn($x) => $x + $y;, где $y переменная из родительской области видимости.

Присваивающий оператор объединения с null. Оператор ??= упрощает код, при котором, если значение переменной (первого операнда) слева не существует или равно null, то переменной присваивается значение справа (второй операнд).

Распаковка внутри массивов. Для массивов с нестроковыми ключами теперь доступна распаковка через ...$array внутри других массивов. Распаковка со строковыми ключами появится только в PHP 8.1

Разделитель в числовых литералах. Если вкратце, то теперь 10000000 можно написать как 10_000_000 c разделителем.

Полный перечень изменений для PHP 7.4

PHP 7.3

Завершающая запятая в вызовах. Завершающие запятые в вызовах функций и методов теперь разрешены.

Полный перечень изменений для PHP 7.3

PHP 7.2

Новый тип object. Был введён новый тип, object, который может использоваться в передаваемых параметрах (контравариантность) и возвращаемых значениях (ковариантность) для любых объектов.

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

Полный перечень изменений для PHP 7.2

PHP 7.1

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

Ничего не возвращающие функции. В PHP 7.1 добавлен тип возвращаемого значения void. Функции с таким заданным типом возвращаемого значения не должны ничего возвращать. То есть либо вообще не содержать ни одного оператора return, либо использовать его без параметра.

Симметричная деструктуризация массива. Можно использовать короткий синтаксис ([]) для деструктуризации массивов с целью присвоения (в том числе в foreach), как альтернатива функции list() (которая продолжает поддерживаться).

Видимость констант класса. Добавлена поддержка определения области видимости для констант класса (public, private, protected).

Обработка нескольких исключений в одном блоке catch В блоке catch теперь можно обрабатывать несколько исключений, перечисляя их через символ вертикальной черты (|). Это может быть полезно, если различные исключения обрабатываются одинаково.

Полный перечень изменений для PHP 7.1

PHP 7.0

Объявления скалярных типов. Скалярные типы объявляют в двух режимах: нестрогом, в котором PHP работает по умолчанию, и строгом. Теперь как в нестрогом, так и в строгом режимах разрешается задавать следующие типы параметров: строки (string), целые числа (int), числа с плавающей точкой (float) и логические значения (bool). Перечисленные типы дополняют другие типы, которые появились в PHP 5: имена классов, интерфейсов, массивы (array) и callable.

Объявления возвращаемых значений. В PHP 7.0 добавлена поддержка объявления возвращаемого типа. Аналогично как и объявления типов аргументов, объявление типа возвращаемого значения указывает, значение какого типа должна вернуть функция. Для объявления типа возвращаемого значения доступны все те же типы, что и для объявления типов аргументов.

Оператор объединения с null. Добавлен оператор объединения с null (??), являющийся синтаксическим сахаром для достаточно распространённого действия, когда совместно используются тернарный оператор и функция isset(). Он возвращает первый операнд, если он задан и не равен null, а в обратном случае возвращает второй операнд.

Оператор spaceship (космический корабль). Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b в конструкции $a <=> $b. Сравнение производится в соответствии с правилами сравнения типов PHP.

Анонимные классы. Добавлена поддержка анонимных классов с помощью new class. Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный класс, а потом его объект не имеет смысла.

Полный перечень изменений для PHP 7.0

PHP <= 5.6

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

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

Использование PDO (PHP Data Objects): Унифицированный интерфейс для работы с базами данных.

Магические методы (__get, __set, __call и другие) - для улучшения функционала классов.

Пространства имен (namespaces): Представлены в PHP 5.3, что обеспечило лучшее управление кодом и предотвращение конфликтов имен.

Anonymous Functions и Closures: Введены функции-замыкания для более удобного функционального программирования.

Traits (с версии 5.4): Появились возможности использовать общие методы между классами.

Генераторы: С версии 5.5 для создания итераторов с меньшими затратами памяти.

Support for JSON: Совместимость с JSON через встроенные функции json_encode/json_decode.

Для ответа вы можете авторизоваться


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.