Новости в PHP версия 8.4

PHP версията 8.4 ще излезе на бял свят за крайния потребител на 21 ноември 2024 година. В тази статия ще Ви представим новостите, които предстоят. Промените са една идея повече отколкото в предходната версия и ще бъдат доста по-интересни и вълнуващи. Прочетете статията, за да надникнете какво интересно предстои.

Поддръжка на версии

Преди да пристъпим към интересната част, нека за момент погледнем две графики свързани с продължителността на живота на PHP версиите до момента.

Ако сравним данните от сегашните графики с миналогодишните, можем да заключим, че поддръжката за сигурност на всяка версия на PHP след 8.0 (включително) е удължена от една на две години. Това означава, че периода, в който можем да използваме спокойно една версия, е удължен от три на четири години.

Новости

Sodium: поддръжка на AEGIS-128L и AEGIS256

AEGIS е AES базирано семейство от алгоритми за криптиране, които са по-бързи от AES-GCM. Разширението Sodium в PHP 8.4 поддържа AEGIS-128L и AEGIS256 алгоритми за криптиране ако е компилирано с версия 1.0.19 на libsodium или по-нова.

В разширението Sodium получаваме по три нови функции и четири нови константи за всеки от тези два алгоритъма.

AEGIS-128L

Константи:

  • SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES: Брой байтове, необходими за ключа, използван от алгоритъма AEGIS-128L. Стойност - 16
  • SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES: Брой байтове, необходими за  стойността на nonce, използвана от алгоритъма AEGIS-128L. Стойност - 16
  • SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES: стойност - 0
  • SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES: стойност - 32

Функции:

  • sodium_crypto_aead_aegis128l_keygen(): Генерира криптографски защитено произволно число с необходимата дължина (SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES) за AEGIS-128L
  • sodium_crypto_aead_aegis128l_encrypt(): Криптира и удостоверява данни с AEGIS-128L
  • sodium_crypto_aead_aegis128l_decrypt(): Проверява и след това декриптира съобщение с AEGIS-128L

AEGIS-256

Константи:

  • SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES: Брой байтове, необходими за ключа, използвана от алгоритъма AEGIS-256. Стойност - 32
  • SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES: Брой байтове, необходими за стойността nonce, използвана от алгоритъма AEGIS-256. Стойност - 32
  • SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES: Стойност - 0
  • SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES: Стойност - 32

Функции:

  • sodium_crypto_aead_aegis256_keygen(): Генерира криптографски защитено произволно число с необходимата дължина (SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES) за AEGIS-256
  • sodium_crypto_aead_aegis256_encrypt(): Криптира и удостоверява данни с AEGIS-256
  • sodium_crypto_aead_aegis256_decrypt(): Проверява и след това декриптира съобщение с AEGIS-256

Нови array_find(), array_find_key(), array_any(), и array_all() функции

Имаме 4 нови функции за работа с масиви. Те целят да улеснят някои често срещани основни операции.

array_find(array $array, callable $callback): mixed

Приема като първи параметър масив, а като втори callback функция. Връща първият елемент за когото callback функцията върне true.

Пример:

array_find([1, 2, 3, 4, 5], fn($value) => $value % 2 === 0);
// 2

array_find_key(array $array, callable $callback): mixed

Подобно на array_find(), но връща ключа сочещ към елемента, който първи върне true.

Пример:

array_find_key(
    ['foo' => 1, 'bar' => 2, 'baz' => 3],
    fn($value) => $value % 2 === 0
);
// "bar"

array_any(array $array, callable $callback): bool

Връща true ако поне един елемент от масива кара callback функцията да върне true.

Пример:

array_any(
    [1 => '', 'bar' => '', 'baz' => ''],
    fn($value, $key) => is_numeric($key),
);
// true

array_all(array $array, callable $callback): bool

Връща true ако всички елементи на масива карат callback функцията да върне положителен отговор при извикване с тях.

Внимание: функцията връща true и при празен масив ([])!

Пример:

array_all(
    [1 => '', 2 => '', 3 => ''],
    fn($value, $key) => is_numeric($key),
);
// true

Intl: Нова grapheme_str_split() функция

Това е нова функция за разделяне на низове от символи. На пръв поглед може да звучи безполезно, но всъщност би имала своите потреби. Разликата между mb_str_split() и grapheme_str_split() , е че първата разделя един низ на Unicode многобайтови знаци, докато новата функция го разделя на функционални единици за писмената система (графеми).

Защо ни е нужна?

Има езици, които за изписването на една буква се нуждаят от комбинация от символи. Също така има комплексни емотикони, които са съставени от няколко такива.

Примери:

Curl: Нови CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY константи за поддръжка на HTTP/3

  • CURL_HTTP_VERSION_3: стойност - int 30
  • CURL_HTTP_VERSION_3ONLY: стойност - int 31

Тези две нови константи могат да се използват за настройка на Curl при опит за правене на HTTP/3 заявки.

Важно е да се спомене, че за да се направи такава заявка Curl разширението изисква минимална версия на libcurl 7.66.0.

Intl: Нова intltz_get_iana_id() функция и IntlTimeZone::getIanaID() метод

Тези две функции връщат канонични идентификатори за часова зона от подадена такава. Това може да звучи странно, но има случаи, в които имат полза.

Пример:

intltz_get_iana_id('Europe/Berlin'); // Валидно, връща същото
// "Europe/Berlin"

intltz_get_iana_id('Mars'); // Невалидно, връща false
// false

intltz_get_iana_id('Europe/Nicosia'); // Връща Asia/Nicosia
// "Asia/Nicosia"

IntlTimeZone::getIanaID('Asia/Chongqing'); // Дублиране на съществуващо местоположение
// "Asia/Shanghai"

В повечето случаи върнатата стойност е същата като подадения идентификатор. Има ситуации, обаче, в които даден идентификатор за часова зона е остарял или е заменен с нов. Тогава тези нови функции помагат за получаване на правилната часовата зона.

Нова request_parse_body() функция

PHP автоматично обработва POST заявките и попълва глобалните променливи $_POST и $_FILES. При други методи като PUT и PATCH обаче, това не се случва автоматично и отговорността за обработването е на самото приложение.

Новата функция request_parse_body() има за цел да изкара вътрешната логика на PHP за обработка на заявки наяве, като по този начин да позволи консистентност при обработката на заявки:

function request_parse_body(?array $options = null): array {}

Функцията чете директно от php://input и връща масив. В него винаги ще има 2 ключа, дори заявката да е празна. Първият ще съдържа данни каквито бихме очаквали да видим в $_POST променливата, а вторият - каквито бихме очаквали да видим във $_FILES. Функцията приема и $options масив, който позволява презаписване на .ini настройки за моментното извикване на функцията.

BCMath: Нова bcdivmod() функция

Новата функция дели число на даден делител и връща масив - първи елемент е частното, а втори е остатъка.

Пример:

bcdivmod('42', '10');
// ["4", "2"]

MBString: Нови mb_ucfirst() и mb_lcfirst() функции

Разширението за PHP mbstring, както предполагам знаете, предоставя многобайтови безопасни функции за повечето стандартни функции обработващи низове в PHP. Ами да, но функциите ucfirst() и lcfirst() досега не бяха от тези. За това във версия 8.4 получаваме mb_ucfirst() и mb_lcfirst(), като те приемат един параметър от тип низ и връщат същия низ, но с първата буква главна и респективно малка.

Пример:

mb_ucfirst('обичам PHP'); // Обичам PHP
mb_lcfirst('Версия 8.4'); // версия 8.4

Нови http_(get|clear)_last_response_headers() функции

PHP предоставя HTTP обвивка, която може да осъществява достъп до отдалечено HTTP съдържание чрез стандартни функции за работа с файловата система.

Пример:

file_get_contents("<https://www.php.net/>")

В случая file_get_contents() ще направи GET заявка до php.net и ще попълни променливата $http_response_header.

Това е исторически артефакт, който някога е бил използван, за да направи HTTP хедърите достъпни, но „магическата“ природа на тази променлива може да бъде объркваща и изисква специална обработка в IDE-тата и статичните анализатори.

За да се подобри яснотата на действията в кода и поддръжката от IDE-та, се препоръчва употребата на две нови функции:

  • http_get_last_response_headers(): ?array - Връща HTTP хедърите получени при последната успешно направена заявка в масив идентичен на това, което бихме видяли в $http_response_header променливата
  • http_clear_last_response_headers(): void - Чисти HTTP хедърите от паметта, след което всички извиквания на http_get_last_response_headers() ще връщат null до следваща успешна заявка

Curl: curl_version() feature_list поддръжка

В новата версия на функцията curl_version() получаваме нов ключ във върнатия от функцията масив. Той се нарича feature_list и съдържа информация за това кои функции на Curl се поддържат и кои не:

curl_version();

[
   "version_number" => 524801,
   "age" => 10,
   "features" => 1438631837,
   "feature_list" => [
     "AsynchDNS" => true,
     "CharConv" => false,
     "Debug" => false,
     // ...
     "HTTP2" => true,
     "HTTPS_PROXY" => true,
     "BROTLI" => true,
     "ALTSVC" => true,
     "HTTP3" => false,
     "ZSTD" => true,
     "HSTS" => true,
     // ...
   ],
   "ssl_version_number" => 0,
   "version" => "8.2.1",
   "host" => "x86_64-pc-linux-gnu",
   // ...
 ]

PCRE2 ъпдейт и Regular Expression промени

Функциите за RegEx в PHP (preg_*) използват библиотеката PCRE (Perl-Compatible Regular Expressions). PHP 8.4 вече ще използва версия на PCRE2 10.44, което ще доведе до няколко промени в използването на RegEx.

Квантори без минимално количество

Досега не беше възможно да правим квантори, които нямат минимално количество. Ако то не ни интересува можехме да сложим 0.

Пример:

preg_match('/a{0,3}/', 'aaa'); // Преди PHP 8.4
preg_match('/a{,3}/',  'aaa'); // След PHP 8.4

Ако минимумът не ни интересува, вече можем просто да го изпуснем.

Интервали във фигурни скоби

От PHP 8.4 вече можем да слагаме интервали и табулации в кванторни двойки.

Пример:

// Преди PHP 8.4
preg_match('/a{5,10}/',      'aaaaaaa');

// След PHP 8.4
preg_match('/a{ 5,10 }/',    'aaaaaaa');
preg_match('/a{5 ,10}/',     'aaaaaaa');
preg_match('/a{ 5, 10 }/',   'aaaaaaa');
preg_match('/a{ 5, 10   }/', 'aaaaaaa');

Актуализация до Unicode 15

PCRE2 версията използвана в PHP 8.4 вече поддържа Unicode 15. Една от новостите там са новите символни класове.

  • Kawi - от U11F00 до 11F5F
  • Nag Mundari - от U1E4D0 до 1E4FF

Пример:

preg_match('/\\p{Kawi}/u', 'abc');
preg_match('/\\p{Nag_Mundari}/u', 'abc');

Regex \w в режим Unicode

Преди версия 8.4 символният клас \w беше еквивалентен на [\\p{L}\\p{N}_].

От версия 8.4 вече ще е еквивалентен на [\\p{L}\\p{N}_\\p{Mn}\\p{Pc}].

Това означава, че ще хваща нови 1849 символа, което може да доведе до проблеми в някои случаи.

Поддръжка за “caseless restrict” модификатор

Става дума за нов модификатор и нов RegEx флаг, които когато се приложат, предотвратяват съвпадението между ASCII и не-ASCII знаци. Например знакът за Келвин (K, "\u{212A}") и английската буква K могат да съвпаднат с “k” (нормална буква “k” на английски) в Unicode Regex:

preg_match('/k/iu', "K");        // Съвпада
preg_match('/k/iu', "k");        // Съвпада
preg_match('/k/iu', "\\u{212A}"); // Съвпада

PHP 8.4 въвежда режим на "caseless restrict", който предотвратява съвпаденията без чувствителност към главни и малки букви (/i) между ASCII и не-ASCII символи. Този режим се активира чрез поставяне на (?r) на позицията, където трябва да започне съвпадението без чувствителност. По същия начин (?-r) го деактивира:

preg_match('/(?r)k/iu', "K");        // Съвпада
preg_match('/(?r)k/iu', "k");        // Съвпада
preg_match('/(?r)k/iu', "\\u{212A}"); // НЕ Съвпада

За да се изпълни целия RegEx в този режим се поддържа нов флаг 'r':

preg_match('/\\x{212A}/iu', "K");   // Съвпада
preg_match('/\\x{212A}/iur', "K");  // НЕ Съвпада

Поддръжка на поглед назад с променлива дължина

PCRE2 10.43 поддържа поглед назад с променлива дължина стига да има описана максимална дължина. Това означава, че PHP 8.4 ще поддържа RegEx от вида:

preg_match('/(?<=Hello{1,5}) world/', 'Hello world'); // Съвпада
preg_match('/(?<=Hello{1,5}) world/', 'Hellooooo world'); // Съвпада
preg_match('/(?<=Hello{1,5}) world/', 'Helloooooo world'); // НЕ Съвпада

Можете да надникнете какви бяха промените и новостите в php 8.3:

Дължината на етикета на именувана група за улавяне е увеличена до 128 символа

PCRE2 10.44 увеличава максималната дължина на етикетите на именувани групи за улавяне. Преди PHP 8.4 максималната дължина на етикета на именувана група за улавяне беше 32 символа:

preg_match('/(?<mylabel1234567890123456789012345>a+)/');

В PHP 8.4 етикетът (напр. от примера по-горе, като се започне от mylabel123... може да бъде с дължина до 128 знака.

phpinfo(): Показване на PHP Integer Size информация

Във обновената функция phpinfo() вече ще можем да видим информация за това колко е размерът на целочисления тип (int) в битове спрямо текущите настройки на PHP.

Това важи и за изходните данни в PHP CLI:

❯ php -a
Interactive shell

php > phpinfo();
phpinfo()

PHP Version => 8.4.0RC1
// ...
PHP Integer Size => 64 bits
// ...

Date: Нови DateTime(Immutable)::get/setMicrosecond методи

Класовете DateTime и DateTimeImmutable вече ще поддържат методите getMicrosecond() и setMicrosecond() за получаване и задаване на микросекундите на времевите обекти:

class DateTime {
    // ...
    public function getMicrosecond(): int {}

    public function setMicrosecond(int $microsecond): static {}
    // ...
}

Нови начини на закръгляне в round()

Преди PHP 8.4 функцията round() поддържаше четири метода за закръгляване:

  • PHP_ROUND_HALF_UP: Закръгля числото навън от нула, когато е по средата
  • PHP_ROUND_HALF_DOWN: Закръгля числото към нула, когато е по средата
  • PHP_ROUND_HALF_EVEN: Закръгля числото към най-близката четна стойност, когато е по средата
  • PHP_ROUND_HALF_ODD: Закръгля числото към най-близката нечетна стойност, когато е по средата

В новата версия функцията round() поддържа четири нови метода за закръгляне:

  • PHP_ROUND_CEILING: Закръгля числото до най-близкото цяло число, по-голямо от числото. (както прави функцията ceil())
  • PHP_ROUND_FLOOR: Закръгля числото до най-близкото цяло число, по-ниско от числото. (както прави функцията floor())
  • PHP_ROUND_TOWARD_ZERO: Закръгля числото към нула
  • PHP_ROUND_AWAY_FROM_ZERO: Закръгля числото навън от нула

Примери:

Date: Нови DateTime(Immutable)::createFromTimestamp методи

DateTime(Immutable)::createFromTimestamp() позволява създаването на времеви обекти директно чрез UNIX timestamp, което до момента се правеше по малко по-сложен начин.

Пример:

$dt = DateTimeImmutable::createFromTimeStamp(1703155440);
$dt->format('Y-m-d'); // "2023-12-21"

$dt = DateTimeImmutable::createFromTimeStamp(1703155440.628);
$dt->format('Y-m-d h:i:s.u'); // "2023-12-21 10:44:00.628000"

Mbstring: Нови mb_trim(), mb_ltrim(), и mb_rtrim() функции

В PHP 8.4 получаваме и три нови мултибайт низови функции. Те са мултибайтов еквивалент на trim(), ltrim(), и rtrim():

  • mb_trim(): позволява премахването на символи от лявата и дясната страна на мултибайтов низ от символи
  • mb_ltrim(): позволява премахването на символи от лявата страна на мултибайтов низ от символи
  • mb_rtrim(): позволява премахването на символи от дясната страна на мултибайтов низ от символи

И трите нови функции по подразбиране премахват само символите за празни пространства като интервал, табулация, нов ред и др.

Промени в синтаксиса/функционалността

Curl: минималната необходима версия на libcurl е увеличена до 7.61.0

Преди PHP 8.4, разширението Curl изискваше минимална версия на libcurl 7.29.0, издадена през 2013 г.

В PHP 8.4, разширението Curl вече изисква libcurl версия 7.61.0, издадена през 2018 г.

MBString: Актуализиране на Unicode базата данни със символи до версия 16

Разширението MBString съдържа частични данни от спецификацията на Unicode, които използва за някои от своите операции.

В PHP 8.3 разширението MBString включваше данните от стандарта Unicode 14.0, пуснат през септември 2022 г.

В PHP 8.4 източникът на данни за Unicode Character Database (UCD) беше актуализиран от версия 14.0 на 16.0, пусната през септември 2024 г. Unicode 16.0 е най-новият UCD, издаден към момента.

Това означава, че разширението MBString може да обработва всички най-нови емотикони и има най-актуалната информация за малки и големи букви, както и за ширината на знаците.

OpenSSL: минималната необходима версия на OpenSSL е увеличена до 1.1.1

От PHP 8.4 минималното изискване на OpenSSL разширението за OpenSSL библиотеката е увеличено от 1.0.1 на 1.1.1. Разширението продължава да е съвместимо и с OpenSSL.

round() - Невалидни начини на закръгляне хвърлят ValueError грешки

Досега ако подадем на функцията round() невалиден начин на закръгляне, тя използва PHP_ROUND_HALF_UP по подразбиране. От новата версия на PHP това поведение бива заменено с грешка от тип ValueError.

Пример:

round(num: 3.14, mode: 42); // Невалиден $mode параметър

ValueError: round(): Argument #3 ($mode) must be a valid rounding mode (PHP_ROUND_*).

Opcache: промени в INI относно как се включва JIT

В PHP версия 8.0 получихме JIT (Just-In-Time compilation). Той има свои настройки в .ini файла, които във версия 8.4 ще претърпят леки промени. JIT остава изключен по подразбиране:

// Преди

opcache.jit=tracing
opcache.jit_buffer_size=0

// Сега

opcache.jit=disable
opcache.jit_buffer_size=64M

Стойностите на константите PHP_ZTS и PHP_DEBUG се променят от int на bool

Константите PHP_ZTS и PHP_DEBUG носят следната информация:

  • PHP_ZTS: Показва дали текущата компилация на PHP е безопасна за нишки
  • PHP_DEBUG: Показва дали текущата компилация на PHP е компилация за отстраняване на грешки

Досега тези две константи бяха от тип int (1 за вярно, 0 за невярно). Те вече ще са от тип bool .

Хеширане на пароли: Стойността на Bcrypt по подразбиране е променена от 10 на 12

PHP 8.4 промени стандартния параметър за стойност на хеша (”cost”) на вградения API за хеширане на пароли от 10 на 12. Тази промяна има за цел да направи паролите по-устойчиви на bruteforce атаки, тъй като съвременният хардуер става все по-мощен. Промяната ще доведе до малко по-дълго време за изчисляване на хеша на дадена парола, но това е необходим компромис, за да се увеличи сигурността на хешовете на паролите.

Приложенията, които изрично задават параметъра за стойност на хеша, няма да бъдат засегнати от тази промяна. Въпреки това, приложенията, използващи стандартните параметри за стойност на хеша, ще трябва да извикат функцията password_needs_rehash(), за да проверят дали паролата трябва да бъде рехеширана с новата стойност на “cost”. Това е еднократен процес, като обновеният хеш може да бъде съхранен в базата данни за бъдеща употреба:

// Потребител се опитва да влезе в системата.

if (password_verify($password, $hash)) {  
    // Паролата е вярна.
    // Трябва ли да се хешира наново?  
    if (password_needs_rehash($hash, PASSWORD_BCRYPT)) {  
        // Създаваме нов хеш.  
        $newHash = password_hash($password, PASSWORD_BCRYPT);
        // Заместваме стария хеш с новия.
        // ...
    }

    // Продължаваме с процеса по влизане в системата.
}

Деприкации

Декларациите на имплицитно нулеви параметри са деприкирани

От PHP 8.4 вече можем да очакваме следните забележки:

function test(array $value = null) {}

// Implicitly marking parameter $value as nullable is deprecated, the explicit nullable type must be used instead

В случая можем да видим, че функцията test() получава един параметър $value от тип масив. Той има стойност по подразбиране null. Но null не е от тип масив. Това поведение все още остава безнаказано, но вече ще получаваме предупреждение за деприкация. Това, което можем да направим в случая, е изрично да декларираме, че този параметър може да остане празен.

Препоръчителни варианти:

function test(?array $value = null) {}
// или
function test(array|null $value = null) {}

E_STRICT константата е деприкирана

В PHP грешките, предупрежденията и забележките имат присвоено ниво на грешка. С помощта на функциите error_reporting() и set_error_handler(), PHP приложенията могат да контролират кои грешки се съобщават и да променят поведението при грешки по подразбиране.

Едно от нивата на грешки в PHP беше E_STRICT. От PHP 7.0 по-голямата част от съществуващите E_STRICT предупреждения бяха прехвърлени в E_NOTICE, а в PHP 8.0 всички E_STRICT известия са вече E_NOTICE.

Тъй като вече няма грешки от тип E_STRICT, той ще бъде деприкиран.

Извикването на session_set_save_handler() с повече от 2 аргумента е деприкирано

Функцията session_set_save_handler() има две различни имплементации. Това се нарича overload. Това поведение е възможно само за вградени PHP функции, но не и за потребителски функции (такива, които са в нашата PHP програма):

function session_set_save_handler(
    callable $open,
    callable $close,
    callable $read,
    callable $write,
    callable $destroy,
    callable $gc,
    ?callable $create_sid = null,
    ?callable $validate_sid = null,
    ?callable $update_timestamp = null
): bool

function session_set_save_handler(
    SessionHandlerInterface $sessionhandler,
    bool $register_shutdown = true
): bool

Заради тази разлика между вградения и потребителския PHP код първата имплементация на функцията ще бъде деприкирана от PHP 8.4 и ще бъде изцяло премахната в PHP 9.0.

Ако ползвате първата имплементация може да промените вашия код по следния начин:

// Преди PHP 8.4
session_set_save_handler('my_session_open', 'my_session_close', 'my_session_read', 'my_session_write', 'my_session_destroy', 'my_session_gc');

// След PHP 8.4
$sessionHandler = new class() implements SessionHandlerInterface {
    public function open(string $path, string $name): bool {
        return my_session_open($path, $name);
    }

    public function close(): bool {
        return my_session_close();
    }

    public function read(string $id): string|false {
        return my_session_read($id);
    }

    public function write(string $id, string $data): bool {
        return my_session_write($id, $data);
    }

    public function destroy(string $id): bool {
        return my_session_destroy($id);
    }

    public function gc(int $max_lifetime): int|false {
        return my_session_gc($max_lifetime);
    }
};

session_set_save_handler($sessionHandler);

Curl: CURLOPT_BINARYTRANSFER деприкация

Тази деприкация е доста закъсняла. Константа CURLOPT_BINARYTRANSFER някога е служила за настройване на Curl чрез функцията curl_setopt(), но от PHP версия 5.1.2 насам не изпълнява никаква функция.

Всички програми използващи PHP версия над 5.1.2 могат спокойно да премахнат употребата на константата без никакви промени.

Премахнати функционалности в PHP 8.4

OCI8 и PDO-OCI разширения са преместени от PHP ядрото към PECL

Двете разширения имат известни проблеми и силна необходимост от поддръжка. Поради тази причина са извадени от ядрото на PHP.

Всички приложения нуждаещи се от разширенията OCI8 и PDO-OCI могат да ги инсталират от PECL:

pecl install oci8
pecl install pdo_oci

IMAP разширението е преместено от PHP ядрото към PECL

Това разширение използва C библиотека, която не е получавала ъпдейти от 2018 година насам, не е “thread-safe” и има още проблеми. Премества се от ядрото към Pecl и се препоръчва да се избягва употребата му. Има по-добре работещи и по-безопасни библиотеки, които могат да извършват същата функционалност. Може да ги откриете тук.

Pspell разширението е преместено от PHP ядрото към PECL

Библиотеките, които използва Pspell, не са получавали ъпдейти през последните няколко години. Разширението бива премахнато от ядрото и преместено в Pecl. В случая има няколко варианта за реакция:

  • Инсталиране на Pspell през Pecl
  • Използване на PHP библиотека
  • Преправяне на кода, така че да използва разширението Enchant

При нужда, най-лесният вариант би бил да инсталирате Pspell през Pecl.

Jump.BG премиум хостинг услуги на конкурентни цени

Заключение

В заключение, PHP 8.4 представя значителен напредък с множество нови функции и подобрения, които правят езика още по-мощен и удобен за използване. Новите функции за масиви като array_find(), array_any() и array_all() улесняват работата с данни, докато подобренията в mbstring и новите функции като mb_ucfirst() и mb_trim() предоставят по-добра поддръжка за мултибайтови низове. Актуализациите в Curl и поддръжката на HTTP/3 отварят нови възможности за уеб разработка, а подобренията в PCRE2 разширяват възможностите за работа с RegEx.

Екипът зад PHP продължава да демонстрира ангажираност към развитието на езика, като внедрява функционалности, които улесняват ежедневната работа на програмистите. С всяка нова версия, PHP става все по-мощен инструмент за уеб разработка, и с нетърпение очакваме да видим как тези нововъведения ще подобрят и оптимизират нашата работа в бъдеще. Вярваме, че PHP ще продължи да се развива и да предоставя иновации за всички програмисти по света.

За повече информация може да посетите:

https://php.watch/versions/8.4

https://php.watch/versions/8.4/releases

https://www.php.net/supported-versions.php

Статия от Александър Найденов

Като възпитаник на ТУЕС - София, Алекс работи активно в сферата на уеб разработката. Стреми се да разширява своите умения и опит в тази област. Разработва PHP / Laravel приложения. В допълнение на това, има страст към Python и JavaScript, които счита за вълнуващи.

Социални мрежи:
Още статии от автора

Абонирайте се за нашия бюлетин

С абонамента си получаваш повече актуални новини и нашите специални промо оферти

Абонирайте се за нашия бюлетин