LINUX.ORG.RU

PHP 8.1

 

PHP 8.1

2

2

Состоялся релиз PHP 8.1 — языка программирования общего назначения, под управлением которого, согласно данным w3techs, работают порядка 78 % сайтов. Среди основных изменений в новой версии стоит отметить добавление перечислений, «зелёных» потоков и интерсекционных типов.

Новая функциональность

Enums

Добавлены перечисления, которые базируются на классах и объектах (поэтому оператор проверки типа instanceof работает и с ними). Перечисления вмещают ряд констант. Но что самое важное, перечисления создают отдельный тип, с которым уже можно работать.

Пример работы с перечислениями, взятый из RFC:

enum Suit { 
  case Hearts; 
  case Diamonds; 
  case Clubs; 
  case Spades; 
} 

function pick_a_card(Suit $suit) { ... } 

$val = Suit::Diamonds; 

pick_a_card($val);        // OK 
pick_a_card(Suit::Clubs); // OK 
pick_a_card('Spades');    // TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given 

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

У элементов перечислений есть также свойство «name», которое хранит имя, хоть оно и является артефактом реализации, поэтому его стоит использовать для отладки.

Подкреплённые перечисления

По умолчанию элементы перечислений не имеют скалярного типа, но всё же его можно объявить при создании перечисления (доступно только для int или string):

enum Suit: string { 
  case Hearts = 'H'; 
  case Diamonds = 'D'; 
  case Clubs = 'C'; 
  case Spades = 'S'; 
} 

Такие значения называются подкреплёнными (backed), ведь значение «подкрепляются» более простым скалярным типом.

Также доступно свойство только для чтения «value», хранящее значение.

Подкреплённые перечисления реализуют интерфейс BackedEnum, который определяет два метода:

  • from(int|string): self принимает скалярный тип и возвращает соответствующее значение перечисления (Enum Case), а если такого нет, то будет выброшена ошибка типа ValueError;

  • tryFrom(int|string): ?self аналогичен первому методу, только теперь ошибка не будет выброшена, а просто возвратится null.

Интерфейсы, трейты и методы в перечислениях

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

Если перечисление реализует какой-то интерфейс, то все элементы перечисления пройдут проверку на тип, реализующий этот интерфейс:


interface Colorful { 
  public function color(): string; 
} 

enum Suit implements Colorful { 
  case Hearts; 
  case Diamonds; 
  case Clubs; 
  case Spades; 

  // Fulfills the interface contract. 

  public function color(): string { 
    return match($this) { 
      Suit::Hearts, Suit::Diamonds => 'Red', 
      Suit::Clubs, Suit::Spades => 'Black', 
    }; 
  } 

  // Not part of an interface; that's fine. 
  public function shape(): string { 
    return "Rectangle"; 
  } 
} 

function paint(Colorful $c) { ... } 

paint(Suit::Clubs);  // Works 

print Suit::Diamonds->shape(); // "rectangle" 

Перечисление значений

Также перечисления реализуют метод cases(), возвращающий список объектов перечисления:

Suit::cases(); 

// [Suit::Hearts, Suit::Diamonds, Suit::Clubs, Suit:Spades] 

Интерсекционные типы

В противовес союзным типам в РНР 8.0, добавлена возможность указания более точных типов, путём их объединения при помощи логического «и». Это достигается благодаря комбинации имён классов или интерфейсов при помощи амперсанда & (пример из php.watch):

function count_and_iterate(Iterator&\Countable $value) { 
    foreach($value as $val) {} 
    count($value); 
} 

Поддерживаются только чистые интерсекционные типы, без композиции с nullable или союзными типами. Кроме того, поддерживаются только имена классов и интерфейсов.

Нити

Добавлены файберы, предоставляющие низкоуровневый интерфейс для создания «зелёных потоков». Нити позволяют управлять параллельными процессами в пределах одного физического процесса. То есть, де-факто не будет двух участков кода, выполняющихся в один момент времени, но файберы позволяют выполнять действия в момент, пока один участок кода простаивает.

Возвращаемый тип never

Добавлена возможность объявить возвращаемый функцией тип как never, если она всегда вызывает остановку программы. Этого можно достичь, вызывая в этой функции конструкцию exit или die. Пример из PHP.Watch


function redirect(string $url): never { 
    header('Location: ' . $url); 
    exit(); 
} 

Цель этого изменения — указать, что вызов определённой функции гарантированно остановит выполнение программы.

final для констант класса

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

class Foo { 
    final public const X = "foo"; 
} 

class Bar extends Foo { 
    public const X = "bar"; 
} 

// Fatal error: Bar::X cannot override final constant Foo::X 

Важно заметить, что приватные константы не могут быть финальными, ведь их невозможно переопределить. Также изменено поведение переопределения констант интерфейсов. Раньше это было запрещено, теперь же разрешено, если константа не определена с ключевым словом final.

Свойства только для чтения

Добавлена поддержка свойств классов только для чтения, значение которых можно устанавливать лишь один раз:

class Test {
    public readonly string $prop;
 
    public function __construct(string $prop) {
        // Заполнение readonly-свойства
        $this->prop = $prop;
    }
}
 
$test = new Test("foobar");
// Так можно
var_dump($test->prop); // string(6) "foobar"
 
// А так нельзя, пускай значение и совпадает
$test->prop = "foobar";
// Error: Cannot modify readonly property Test::$prop

Ключевое слово readonly можно использовать только с типизированным свойством. Инициализация свойства только для чтения может происходить только в классе, содержащем это свойство.

При попытке повторного установления значения или удаления переменной будет выброшено исключение типа Error.

Кроме этого:

  • Добавлены функции:
    • fsync: синхронизация изменений в файле (включая метадату);
    • fdatasync: синхронизация изменений в файле без метадаты;
    • array_is_list: проверяет, является ли массив списком;
    • Функции для поддержки потокового шифрования XChaCha20 в Sodium;
  • Добавлено новое поле full_path в суперглобальном массиве $_FILES, хранящее полный путь к файлам, который был передан браузером;
  • Синтаксис first-class callable;
  • Новый атрибут #[ReturnTypeWillChange];
  • Оператор распаковки массивов теперь поддерживает массивы со строковыми ключами;
  • Добавлена поддержка алгоритмов хеширования xxHash и MurmurHash3;
  • Добавлен новый параметр $options для функций хеширования для определения алгоритмоспецифичных дополнительных опций;
  • Добавлена поддержка префикса 0o/0O для восьмеричных чисел;
  • Новый класс IntlDatePatternGenerator, позволяющий лучше поддерживать локализованные даты;
  • В phar добавлена поддержка алгоритмов подписи OpenSSL-256 и OpenSSL-512;
  • В расширение mysqli добавлена константа MYSQLI_REFRESH_REPLICA аналогичная уже существующей константе MYSQLI_REFRESH_SLAVE, это сделано из-за того, что в MySQL версии 8.0.23 некоторые опции, содержащие слова «slave», были признаны устаревшимы и заменены на аналогичные с «replica». Тем не менее MYSQLI_REFRESH_SLAVE в РНР устаревшей не признана и планов по удалению этой константы нет;
  • GD:
  • Curl:
    • Добавлена поддержка DNS-over-HTTPS;
    • Добавлен класс CURLStringFile, позволяющий осуществлять загрузку файла путём отправки его содержимого.

Изменения

Ограничение использования суперглобального массива $GLOBALS

Суперглобальный массив $GLOBALS, хранящий пары имя_переменной => ссылка_на_переменную больше нельзя передавать по ссылке, приравнивать его к пустому массиву или ссылке на переменную.

// Будет работать:
foreach ($GLOBALS as $var => $value) {
    echo "$var => $value\n";
}
$GLOBALS['x'] = 1;
$GLOBALS['x']++;
isset($GLOBALS['x']);
unset($GLOBALS['x']);
// ...что угодно, используя $GLOBALS['x'].

// Выдаёт ошибку времени компиляции:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
// ...и другие подобные операции чтения-записи над $GLOBALS

// Выдаёт исключения типа Error во время исполнения:
by_ref($GLOBALS);

А также:

  • Функции для работы HTML теперь будут обрабатывать одинарные кавычки ', а невалидные символы теперь будут просто заменены на � (U+FFFD);
  • Теперь класс SplFixedArray реализует интерфейс JsonSerializable, что позволит функции json_encode воспринимать его как массив;
  • Режим интерактивной оболочки (php -a) теперь требует наличия расширения readline;
  • Функции fputcsv и SplFileObject::fputcsv теперь могут принимать новый параметр, оборачивающий конец строки;
  • Функция version_compare() теперь не может принимать частичные значения для операторов;
  • Функция compact() теперь выбрасывает предупреждение, если типы её параметров отличались от массива и строки;
  • Разрешено использование ключевого слова new в параметрах функции по умолчанию, аргументах атрибутов, инициализаторах статических переменных и глобальных констант;
  • Благодаря изменениям в работе OPcache, производительность была повышена на 0.5-8%;
  • В phar алгоритм подписи по умолчанию изменён с SHA1 на SHA256;
  • Расширение MySQLi теперь использует режим выброса исключений при возникновении ошибки;
  • Следующие ресурсы стали объектами:
    • file_info => finfo
    • imap => IMAP\Connection
    • ftp => FTP\Connection
    • Функция imageloadfont теперь возвращает экземпляр класса GdFont
    • Ресурсы LDAP мигрировали в экземпляры классов LDAP\Connection, LDAP\Result и LDAP\ResultEntry
    • Ресурсы PostgreSQL мигрировали в экземпляры классов PgSql\Connection, PgSql\Result и PgSql\Lob
    • pspell => PSpell\Dictionary, pspell config => PSpell\Config

Объявлено устаревшим

>>> Подробности

★★★

Проверено: sudopacman ()
Последнее исправление: sudopacman (всего исправлений: 22)
Ответ на: комментарий от stevejobs

Никак, когда пытались добавить, это било или слишком сложно, или вызывало потери в производительности.

Все используют докблоки.

fernandos ★★★
() автор топика
Ответ на: комментарий от derlinux

Когда все переедут на ПДО.

То есть никогда, увы.

fernandos ★★★
() автор топика

С праздником программистов, использующих PHP!

Шас спою

Язык программирования может быть плохой, но алгоритм В ЛЮБОМ СЛУЧАЕ ДОЛЖЕН БЫТЬ ХОРОШИМ

Плохой танец, исполняемый плохим ТАНЦОРОМ годится лишь для

ЦИРКА  
anonymous
()
Ответ на: комментарий от fernandos

Не. Сравнение си с питоном больше доставляет.

ashot ★★★★
()

Offtopic касательно лого. Синий слоник так хитро смотрит потому что он пердит?

beastie ★★★★★
()
Ответ на: комментарий от LamerOk

Потому что хостинг. Тысячи тысяч сайтов хостятся на шаред хостинге, потому что у владельцев нет денег/желания брать вдс/сервер. И еще простота входа. Можно фигачить HTML и прямо туда вставлять код PHP

anonymous
()
Ответ на: комментарий от x-signal

«Общего назначения»? Вы серьёзно?..

Серьёзно. Я как-то видел сборочную обвязку на PHP для сишной либы.))

wandrien ★★
()
Ответ на: комментарий от x-signal

Внезапно, но пыхпых можно использовать как любой нормальный скриптовый язык. Не сложнее того же Перла или Питона.

WatchCat ★★★★★
()
Ответ на: комментарий от fornlr

Во, блин! У меня фанаты появились? #йазвизда!

ashot ★★★★
()
Ответ на: комментарий от WatchCat

к сожалению, не все понимают разницу между скриптом и приложением и могут признать, что не стоит городить приложение и все на свете на языке для скриптов. Некоторым плотно прошивают клише что веб-приложение и сайт это что-то такое же простое как скрипт, где будет «быстрее», «легче», «дешевле» использовать пхп и его код на хештаблицах.

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 2)
Ответ на: комментарий от tz4678

Кто «он»? Не пиши ерунду, пхп никогда сам по себе не используется, он бекэнд к веб-серверу. На веб-сервере (нормальный называется nginx) есть настройка по каому урлу что вызывать.

firkax ★★★★★
()
Ответ на: комментарий от derlinux

Лучше бы mysql_ функции вернули. PDO не нужен.

firkax ★★★★★
()
Ответ на: комментарий от WatchCat

т е, строго говоря, язык только для скриптов сейчас не только не нужен, но и опасен. А если надо изящно взаимодействовать через интерфейс шелл оболочек в программах, я бы сейчас заюзал скалу со специальной библиотекой и компилил бы такие «скрипты» в бинарники граалем или искал/делал лёгкий или персистентный рантайм жабы (в грейдл демоне что-то такое есть). Тогда будет и скорость и лёгкость и код приличный и не пахнущий дурно.

Syncro ★★★★★
()
Ответ на: комментарий от fernandos

Не про встроенный речь, а про отдельный веб-сервер. Один Пхп никогда нигде не используется, а в связке с веб-сервером. Т.е. в случае с пхп бесплатный роутинг есть всегда в виде веб-сервера и файловой системы.

Все по unix-вею.

anonymous
()
Ответ на: комментарий от tz4678

Будем через cgi пускать и http4 через nginx отдавать, вопросы?

MOPKOBKA ★★★★★
()
Ответ на: комментарий от anonymous

Один Пхп никогда нигде не используется, а в связке с веб-сервером

При разработке используется.

Все по unix-вею.

 Сова 
  ⬇
Глобус
fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

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

anonymous
()
Ответ на: комментарий от fernandos

динамические свойства признали устаревшими.

Ха!

НУ И ГДЕ ВАШ ПИТОН?

wandrien ★★
()
Ответ на: комментарий от anonymous

Речь про роутинг уровня говнокода спуфинга.

fernandos ★★★
() автор топика
Ответ на: комментарий от WatchCat

Внезапно, но пыхпых можно использовать как любой нормальный скриптовый язык

Можно-то можно, но не представляю, кто этим занимается. Разве что уставший от веба пыхер.

x-signal ★★
()
Ответ на: комментарий от wandrien

Чел, мы тут шутим и прикалываемся.

Про жопу слона и при участии модераторов. Какашка, писька и жопа - возрастная норма. Этап развития, как подростковые прыщи. Симптом социализации, если хотите, типа ветрянки. Переболеет не каждый, но большинство. А многие тут похоже так и остались на этом этапе развития.

Djanik
()
Ответ на: комментарий от x-signal

Я давно еще как-то видел GUI-приложения под винду на пыхе. Больше такого не попадалось, слава богу.

wandrien ★★
()
Ответ на: комментарий от x-signal

«Общего назначения»? Вы серьёзно?..

Ну и что тебя удивило ? Открою тебе тайну, в\для PHP есть вполне себе реализации работы как для аппаратных фишек навроде последовательных портов и i2c, так и для гуевых (хотя сейчас уже мертво, потому что никому не нужно) php-qt, php-gtk.

Можно-то можно, но не представляю, кто этим занимается. Разве что уставший от веба пыхер.

Или тот, кому незачем учить другие языки для того, что можно сделать и на пыхе.

У меня пол-серверной части умного дома, написано на PHP. Работа с файлами есть, работа со строками есть, работа с числами есть, работа с http есть, ну и напуркуа мне учить еще какой-то язык, если результирующий код будет ТОТ ЖЕ САМЫЙ, разве что с поправкой на семантику ?

windows10 ★★★★★
()
Ответ на: комментарий от windows10

завтра в минорной версии выкинут метод black_overlord_slave, который вы использовали и все ваши шкрипты сломаются при авто обновлении пхп (сыкьюрити !) и спалят хату

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

Лол, это в новости, в которой написано

В расширение mysqli добавлена константа MYSQLI_REFRESH_REPLICA аналогичная уже существующей константе MYSQLI_REFRESH_SLAVE, это сделано из-за того, что в MySQL версии 8.0.23 некоторые опции, содержащие слова «slave», были признаны устаревшимы и заменены на аналогичные с «replica». Тем не менее MYSQLI_REFRESH_SLAVE в РНР устаревшей не признана и планов по удалению этой константы нет

, серьёзно?

Ну и автообновление на новую мажорную версию это, конечно, жёстко.

fernandos ★★★
() автор топика
Последнее исправление: fernandos (всего исправлений: 1)
Ответ на: комментарий от Syncro

Рантайм природа языка прячет большинство ошибок под капот

strict-режим

историческое пренебрежение

не проблема языка

Базар без собора в сообществе

не является проблемой вообще

о совместимости (чтобы модуль/компонент одного фреймворка/системы подходил для другой, чтобы компоненты вообще были заменяемы) с другими раньше не думали совсем

PSRам уже больше 5 лет

Доларсайны и неизящный для динамического языка синтаксис

субъективщина

Это усугубляется ещё и исторической ориентацией на структурирование хеш-таблицами, которые в пыхе называют массивами

под капотом PHP всё есть хэш-таблица

В результате качественных библиотек тоже мало и они вам часто не подходят, вы делаете свой велосипед на каждую потребность и бьетесь также о всевозможные нерелевантные задаче проблемы

например?

PHP, если что, никогда не являлся в каждой бочке затычкой, у него своя ниша. Использовать его за пределами этой ниши - ну, безумству храбрых

Ford_Focus ★★★★★
()
Ответ на: комментарий от Syncro

завтра в минорной версии выкинут метод black_overlord_slave

Это не так происходит. Выкидывание чего-то сначала обсуждается, потом депрекейтится (кидаются предупреждения) и только потом выкидывается (может быть, а может и нет). Ну а если ты за пару лет не соизволил своё говно мамонта поправить, то в целом можешь сидеть и не обновляться.

no-such-file ★★★★★
()
Ответ на: комментарий от Syncro

завтра в минорной версии выкинут метод black_overlord_slave, который вы использовали и все ваши шкрипты сломаются при авто обновлении пхп (сыкьюрити !) и спалят хату

Ну они ж не у меня дома его выкинут :)

windows10 ★★★★★
()
Ответ на: комментарий от Ford_Focus

если вы выбрали пхп вы будете огребать со всех этих проблем даже если вы их проблемами не считаете. Какой толк от пср если код для зендфреймворка нельзя использовать в симфони, а в вордпресе это будет 100% блоб ?

Syncro ★★★★★
()
Ответ на: комментарий от windows10

если вы не будете обновляться, вас взломают или заразят вирусней и опять же спалят хату если не заплатите

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

если вы не будете обновляться, вас взломают или заразят вирусней и опять же спалят хату если не заплатите

С чего бы это ?

Чувак, у меня скрипт, бесконечный while, в котором крутится чтение цифры из файла, и идет запись в другой файл, если эта цифра больше 4000. Шо тут обновлять, и шо тут ломать ? Это можно делать хоть на баше, хоть на си, но зачем, если есть божественный зеленый синий слоник.

windows10 ★★★★★
()
Ответ на: комментарий от windows10

пых ломают вообще в автоматическом режиме и очень быстро, я не меньше 5и раз сталкивался с ситуациями когда заражённый говносервер с пхп спамил или что-то такое делал

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 1)
Ответ на: комментарий от windows10

т.е. с пыхом ваш выбор бинарный - либо вы сам ломаете все обновляясь, либо вы не обновляетесь и вас ломают

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

Какой толк от пср если код для зендфреймворка нельзя использовать в симфони,

какой код и какой функционал нельзя вынести в пакет композера и использовать хоть с вордпрессом?

Ford_Focus ★★★★★
()
Последнее исправление: Ford_Focus (всего исправлений: 1)
Ответ на: комментарий от Ford_Focus

учитывая что вордпрес написан в стиле пхп4 это будет во всех отношениях блоб, код для фреймворков потребует отдельного приложения которое с остальным вордпресом будет взаимодействовать опять же как блоб

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

едрить у тебя каша в голове. Карач, принесёшь конкретные примеры, тогда и поговорим.

Ford_Focus ★★★★★
()

языка программирования общего назначения

О как. Сроду не знал что это язык обшего назначения даже когда пытался на нем лет 15 назад писать с помощью php-gtk.

Хотя название языка как бы намекает что это не язык общего назначения.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от fernandos

При разработке используется.

Ну, сами виноваты кто так делает. Нормальный веб-сервер ту же задачу выполняет быстрее (он на си), надёжнее (он давно отлажен и тестируется непрерывно всем интернетом) и универсальнее чем пхп-скрипты, хоть свои, хоть от какого-то фреймворка. Надо понимать что если хочешь отлаживать веб в локальной среде разработки - то в этой самой среде должен быть и nginx.

Но вообще тенденция для php закономерная - авторы фреймворков любят велосипедить не только функционал веб-сервера (скоро дойдут прослушивание https-порта на пхп писать) но и функционал самого пхп: вместо готовой функции из ядра пхп пишут свою её реализацию на скриптах с 10 обёртками (для совместимости с самими собой) вокруг.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ну, сами виноваты кто так делает

Виноваты в чём? В использовании удобного средства? Во сволочи, да?

Веб-сервер ту же задачу выполняет быстрее (он на си)

Я вам по секрету скажу, при разработке скорость непосредственной работы на встроенном веб-сервере не является приоритетной, всё равно в проде используется что-то нормальное. А веб-сервер ПХП тоже на си.

надёжнее

Я вам по секрету скажу, при разработке, надёжность на встроенном веб-сервере не является приоритетной, всё равно в проде используется что-то нормальное.

и универсальнее чем пхп-скрипты

Веб-сервер универсальнее чем пхп-скрипты? Вы в своём уме?

Но вообще тенденция для php закономерная - авторы фреймворков любят велосипедить не только функционал веб-сервера

Вы бредите что ли? Какие к чёрту авторы фрейворков любят велосипедить не только функциональность (словарь откройте) веб-сервера? У РНР встроенный веб-сервер есть. https://www.php.net/manual/en/features.commandline.webserver.php

но и функционал самого пхп: вместо готовой функции из ядра пхп пишут свою её реализацию на скриптах с 10 обёртками (для совместимости с самими собой) вокруг.

Чтобы что?

fernandos ★★★
() автор топика
Ответ на: комментарий от firkax

Насчёт тенденции соглашусь отчасти. Но есть задачи, когда оправданно использовать те же Swoole/Swoft.

northerner ★★★
()
Ответ на: комментарий от fernandos

слишком сложно, или вызывало потери в производительности

даже интересно теперь, как они этого добились

можно сделать как в джаве - дженерики стираются перед исполнением

в джаве на этапе компиляции, а в пхп можно прямо после разбора первоначального аста, т.е. в IR оно уже не должно попадать вообще

на этапе парсинга пропустить всё, что между угловых скобочек - это элементарная операция

никакого оверхеда по производительности в рантайме нет, потому что нечему, всё стёрли

совместимости с легаси кодом не нарушает (именно поэтому в джаве так и сделали, это основная причина)

что, что тут может быть сложно и медленно

по сути, это те же самые докблоки, только в нормальном синтаксисе

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

можно сделать как в джаве - дженерики стираются перед исполнением

Для этого есть сторонние средства.

Тут дело в чём, кто следит за типами? Или интерпретатор, или какой-то линтер. Если во время исполнения этих дженериков не будет, то интерпретатор уже не следит за оными. Но он всё ещё следит за другими типами. Каша выходит.

fernandos ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.