0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Разработчики представили новую версию языка программирования PHP 8.1. Вместе с преподавателем Хекслета Владленом Гилязетдиновым рассказываем о важных изменениях и объясняем, почему ее так долго ждали.</strong></p>
1
<p><strong>Разработчики представили новую версию языка программирования PHP 8.1. Вместе с преподавателем Хекслета Владленом Гилязетдиновым рассказываем о важных изменениях и объясняем, почему ее так долго ждали.</strong></p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Самое важное</a></li>
3
<ul><li><a>Самое важное</a></li>
4
<li><a>Новые функции</a></li>
4
<li><a>Новые функции</a></li>
5
</ul><h2>Самое важное</h2>
5
</ul><h2>Самое важное</h2>
6
<h3>Перечисления</h3>
6
<h3>Перечисления</h3>
7
<p>Введение Enum избавляет от необходимости использовать костыльные решения (например, создавать перечисления из классов) и подтягивать сторонние пакеты. Обновление действительно ждали - об этом свидетельствует популярность<a>руководств по реализации перечислений</a>в PHP и библиотек<a>Enum</a>и<a>PHP-enum</a>.</p>
7
<p>Введение Enum избавляет от необходимости использовать костыльные решения (например, создавать перечисления из классов) и подтягивать сторонние пакеты. Обновление действительно ждали - об этом свидетельствует популярность<a>руководств по реализации перечислений</a>в PHP и библиотек<a>Enum</a>и<a>PHP-enum</a>.</p>
8
<p>Перечисление в виде типа дает контроль над кодом, помогает соблюдать принцип DRY и снизить сложность восприятия кода.</p>
8
<p>Перечисление в виде типа дает контроль над кодом, помогает соблюдать принцип DRY и снизить сложность восприятия кода.</p>
9
<p>Предположим, что приложение должно учитывать времена года. Хорошо, если они реализованы в виде строк (например, $season = 'winter'), но если речь идет о числах в виде $season = 0, код очень скоро начинает вызывать вопросы. Строки и числа, используемые для перечислений, тяжело валидировать. Для каждой функции, в которую приходит строка или число $enumVar, нужно проверять, что все работает хорошо. С Enum валидация становится проще:</p>
9
<p>Предположим, что приложение должно учитывать времена года. Хорошо, если они реализованы в виде строк (например, $season = 'winter'), но если речь идет о числах в виде $season = 0, код очень скоро начинает вызывать вопросы. Строки и числа, используемые для перечислений, тяжело валидировать. Для каждой функции, в которую приходит строка или число $enumVar, нужно проверять, что все работает хорошо. С Enum валидация становится проще:</p>
10
<h3>Readonly-свойства</h3>
10
<h3>Readonly-свойства</h3>
11
<p>Фича полезна при реализации объектов типа value и data transfer. Она предназначена для работы с вычисляемыми значениями и позволяет не беспокоиться, что значение будет перезаписано.</p>
11
<p>Фича полезна при реализации объектов типа value и data transfer. Она предназначена для работы с вычисляемыми значениями и позволяет не беспокоиться, что значение будет перезаписано.</p>
12
<p>При организации классов бывают случаи, когда нужна "вычисляемая константа". В предыдущих версиях разработчик создавал функцию, которая вызывается каждый раз, когда нужно получить значение константы, и забивает стек вызовов. Альтернативное решение - использование статистических переменных, которые повышают вероятность ошибки из-за своей изменчивости. Readonly поможет однозначно понять, что переменную присвоили, и работать с ее значением.</p>
12
<p>При организации классов бывают случаи, когда нужна "вычисляемая константа". В предыдущих версиях разработчик создавал функцию, которая вызывается каждый раз, когда нужно получить значение константы, и забивает стек вызовов. Альтернативное решение - использование статистических переменных, которые повышают вероятность ошибки из-за своей изменчивости. Readonly поможет однозначно понять, что переменную присвоили, и работать с ее значением.</p>
13
<h3>Файберы</h3>
13
<h3>Файберы</h3>
14
<p>Примитивы, которые позволяют синхронно держать в памяти несколько процессов и запускать каждый из них при необходимости. Вероятно, главная задача нововведения - сделать "асинхронные" участки кода быстрее и упростить их поддержку.</p>
14
<p>Примитивы, которые позволяют синхронно держать в памяти несколько процессов и запускать каждый из них при необходимости. Вероятно, главная задача нововведения - сделать "асинхронные" участки кода быстрее и упростить их поддержку.</p>
15
<p>Файбер вряд ли будет широко использоваться при разработке ПО на высоких уровнях. Но на более низких (фреймворки Laravel, Symfony, Yii2, etc; пакеты для асинхронной работы ReactPHP и Amp) они точно будут полезны. В частности, для повышения производительности, переписывания части блоков кода с yield и, возможно, для переписывания реализаций корутин на основе генератора.</p>
15
<p>Файбер вряд ли будет широко использоваться при разработке ПО на высоких уровнях. Но на более низких (фреймворки Laravel, Symfony, Yii2, etc; пакеты для асинхронной работы ReactPHP и Amp) они точно будут полезны. В частности, для повышения производительности, переписывания части блоков кода с yield и, возможно, для переписывания реализаций корутин на основе генератора.</p>
16
<h2>Новые функции</h2>
16
<h2>Новые функции</h2>
17
<ul><li><strong>Array_is_list</strong>- функция помогает проверить, что ключи элементов массива это числа идущие по порядку от 0.</li>
17
<ul><li><strong>Array_is_list</strong>- функция помогает проверить, что ключи элементов массива это числа идущие по порядку от 0.</li>
18
<li><strong>fsync и fdatasync</strong>- функции дополнительной проверки при редактировании файла, которые синхронизируют изменения. Интересно, что на Windows разницы между функциями нет: fdatasync в данном случае - ссылка на fsync.</li>
18
<li><strong>fsync и fdatasync</strong>- функции дополнительной проверки при редактировании файла, которые синхронизируют изменения. Интересно, что на Windows разницы между функциями нет: fdatasync в данном случае - ссылка на fsync.</li>
19
<li><strong>Serializable становится deprecated</strong>- после перехода на новую версию придется удалить из кода implements Serializable и поменять все функции serialize()/unserialize() на __serialize()/__unserialize()</li>
19
<li><strong>Serializable становится deprecated</strong>- после перехода на новую версию придется удалить из кода implements Serializable и поменять все функции serialize()/unserialize() на __serialize()/__unserialize()</li>
20
<li><strong>resource становится deprecated</strong>- если resource использовался в коде, при переходе на новую версию придется менять все вхождения. Гайд по миграции можно найти<a>здесь</a>.</li>
20
<li><strong>resource становится deprecated</strong>- если resource использовался в коде, при переходе на новую версию придется менять все вхождения. Гайд по миграции можно найти<a>здесь</a>.</li>
21
</ul><h3>Другие обновления</h3>
21
</ul><h3>Другие обновления</h3>
22
<p>Оставшиеся обновления можно поделить на два типа:</p>
22
<p>Оставшиеся обновления можно поделить на два типа:</p>
23
<ul><li><strong>Делают код чище</strong>. К этой категории относятся явное восьмеричное числовое обозначение, тип возвращаемого значения never, callback-функции как объекты первого типа, расширенная инициализация объектов и пересечение типов.</li>
23
<ul><li><strong>Делают код чище</strong>. К этой категории относятся явное восьмеричное числовое обозначение, тип возвращаемого значения never, callback-функции как объекты первого типа, расширенная инициализация объектов и пересечение типов.</li>
24
<li><strong>Дают больше контроля в коде.</strong>Здесь речь идет о финальных константах класса.</li>
24
<li><strong>Дают больше контроля в коде.</strong>Здесь речь идет о финальных константах класса.</li>
25
</ul><p>Отдельно стоит отметить прирост производительности в новой версии: на 23% для демо-приложения на фреймворке Symfony и на 3,5% для WordPress по сравнению с PHP 8. Важно понимать, что производительность часто индивидуальна и зависит от конкретного приложения.</p>
25
</ul><p>Отдельно стоит отметить прирост производительности в новой версии: на 23% для демо-приложения на фреймворке Symfony и на 3,5% для WordPress по сравнению с PHP 8. Важно понимать, что производительность часто индивидуальна и зависит от конкретного приложения.</p>