HTML Diff
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>