Пасля года распрацоўкі прадстаўлены рэліз мовы праграмавання PHP 7.4. Новая галінка ўключае серыю новых магчымасцяў, а таксама некалькі змен, якія парушаюць сумяшчальнасць.
class User {
public int $id;
public string $name;
}
Скарочаны сінтаксіс вызначэння функцый "fn(parameter_list) => expr" з прывязкай вобласці бачнасці па значэнні. Напрыклад "fn($x) => $x + $y" з'яўляецца аналагам "$fn2 = function ($x) use ($y) {return $x + $y;}");
Скарочаны аператар прысваення "??=", які можа выкарыстоўвацца для вызначэння значэння па змаўчанні ("a ?? = b" аналагічна "a = a ?? b", калі "a" вызначаны яго значэнне захоўваецца, а калі не вызначаны прысвойваецца значэнне "b") );
Абмежаваная магчымасць захавання іерархіі атрымання ў спадчыну тыпаў у вытворных ад іх тыпах вяртаюцца значэнняў або магчымасць пераўтварэння іерархіі зыходных тыпаў на супрацьлеглую ў вытворных тыпах аргументаў (падступнасць які вяртаецца тыпу і контраварыянтнасць тыпу аргументаў). У PHP зараз можна выкарыстоўваць наступныя канструкцыі:
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
Аператар распакавання ўсярэдзіне масіваў «…$var», які дазваляе выконваць падстаноўку існуючых масіваў пры вызначэнні новага масіва;
Магчымасць нагляднага афармлення вялікіх лікаў з падзельнікамі ў лікавых літаралах (1_000_000_00);
Падтрымка слабых спасылак, якія дазваляюць захаваць спасылку на аб'ект, але не якія блакуюць выдаленне звязанага аб'екта зборшчыкам смецця;
Новы механізм серыялізацыі аб'ектаў (камбінацыя Serializable і __sleep()/__wakeup()), які прыйшоў на змену інтэрфейсу Serializable, які будзе абвешчаны састарэлым;
// Вяртае масіў, які змяшчае ўсе станы аб'екта;
public function __serialize(): array;
// Аднаўляе стан аб'екта з масіва
public function __unserialize(array $data): void;
Дазволена генерацыя выключэнняў з метаду __toString();
Дададзена падтрымка папераджальнай загрузкі кэша аб'ектнага кода. Для наладкі дададзены параметр opcache.preload, праз які можна пазначыць PHP-скрыпт, які будзе скампіляваны і запушчаны пры запуску сервера. Дадзены скрыпт можа загрузіць опкод іншых файлаў праз іх прамое ўключэнне ці пры дапамозе функцыі opcache_compile_file();
У пашырэнне Hash дададзена функцыя crc32c для вылічэння кантрольных сум з выкарыстаннем палінома Кастаньолелі;
У функцыю password_hash() дададзена падтрымка метадаў хэшавання пароляў argon2i і argin2id, у рэалізацыі бібліятэкі Sodium, калі PHP збіраецца без libargon;
Дададзена функцыя mb_str_split(), аналагічная str_split(), але якая аперуе не байтамі а пазіцыямі знакаў у шматбайтавым радку;
У функцыі strip_tags() дададзена магчымасць перадачы масіва з імёнамі тэгаў, г.зн. замест strip_tags($str, ' ') зараз можна паказаць strip_tags($str, ['a', 'p']);
У proc_open() дазволена пералік аперанд у масіве, замест указанне радка для запуску, а таксама рэалізаваная магчымасць перанакіравання струменяў і падтрымка нулявога файлавага дэскрыптара;
// Як 2>&1 у shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// як 2>/dev/null або 2>nul у shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
З базавай пастаўкі выключаны пашырэнні Firebird/Interbase, Recode і WDDX. Дадзеныя пашырэнні зараз распаўсюджваюцца праз PECL;
Пераведзены ў разрад састарэлых такія магчымасці, як укладзеныя тэрнарныя аператары без дужак, зварот да элементаў масіваў і радкоў з выкарыстаннем фігурных дужак («$var{$idx}»), функцыя is_real() і прывядзенне да тыпу real, выкарыстанне ключавога слова parent без бацькоўскага класа, параметр канфігурацыі allow_url_include, ужыванне array_key_exists() над аб'ектамі.
Забяспечана выснова папярэджання аб прымяненні састарэлай магчымасці пры спробе апрацоўкі некарэктных сімвалаў у функцыях
base_convert(), bindec(), octdec() і hexdec(), а таксама пры ўказанні нерадковага шаблону ў mb_ereg_replace().