Други промени
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Други промени
Референца за `migration83.other-changes.php` со подобрена типографија и навигација.
Други промени
Core промени
FFI
Името на опсегот дефинирано со специјален е дозволено за време на претходно вчитување кога opcache.preload_user е тековниот системски корисник. Претходно, повикувањето Името на опсегот дефинирано со специјален не беше можно за време на претходно вчитување ако opcache.preload_user директивата беше поставена.
FPM
FPM CLI тестот сега паѓа ако патеката на сокетот е подолга од поддржаната од ОС.
DOMImplementation::getFeature()
Во CLI и phpdbg SAPIs, претходното вчитување не бара opcache.preload_user директивата да биде поставена повеќе кога се работи како root. Во други SAPIs, оваа директива е потребна кога се работи како root бидејќи претходното вчитување се врши пред SAPI да се префрли на непривилегиран корисник.
— Стандардна PHP библиотека (SPL)
Блокирање fread() на сокет конекција се враќа веднаш ако има какви било баферирани податоци наместо да чека повеќе податоци.
Меморискиот стрим повеќе не паѓа ако поместувањето за барање е надвор од крајот. Наместо тоа, меморијата ќе се зголеми при следниот запис и податоците помеѓу стариот крај и поместувањето ќе бидат пополнети со нула бајти, слично на тоа како работат датотеките.
stat() операциите за пристап како file_exists() и слично сега ќе користат вистинска патека наместо вистинската патека на стримот. Ова е конзистентно со отворањето на стримот.
Промени во SAPI модули
Променети функции
Јадро
gc_status() додаде следните 8 полиња:
"running"=> bool"protected"=> bool"full"=> bool"buffer_size"=> int"application_time"=> float: Вкупно време на апликацијата, во секунди (вклучувајќи collector_time)"collector_time"=> float: Време поминато во собирање циклуси, во секунди (вклучувајќи destructor_time и free_time)"destructor_time"=> float: Време поминато во извршување на деструктори за време на собирање циклуси, во секунди"free_time"=> float: Време поминато во ослободување вредности за време на собирање циклуси, во секунди
class_alias() сега поддржува креирање на носец за внатрешна класа.
Поставување open_basedir при извршување со користење на ini_set('open_basedir', ...); веќе не прифаќа патеки што ја содржат родителската директориум (..). Претходно, беа забранети само патеките што започнуваа со .. беа забранети. Ова лесно можеше да се заобиколи со додавање на ./ на патеката.
Корисничките ракувачи на исклучоци сега фаќаат исклучоци при исклучување.
Резултирачкиот HTML од highlight_string() and
highlight_file() е променет. Празниот простор помеѓу надворешните HTML тагови е отстранет. Новите редови и празни места повеќе не се претвораат во HTML ентитети. Целиот HTML сега е завиткан во
<pre> таг. Надворешниот <span>
таг е споен со <code> tag.
Календар
easter_date() сега поддржува години од 1970 до 2.000.000.000 на 64-битни системи, претходно поддржуваше само години во опсег од 1970 до 2037.
, за разлика од
curl_getinfo() сега поддржува две нови константи:
CURLINFO_CAPATH and
CURLINFO_CAINFO. Ако опцијата е null, присутни се следните два дополнителни клуч:
"capath" and "cainfo".
DOM
Променето DOMCharacterData::appendData() привремениот тип на враќање на true.
DOMDocument::loadHTML(),
DOMDocument::loadHTMLFile()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
DOMDocument::load() сега имаат привремен тип на враќање на bool. Previously, this was documented as having a return type of DOMDocument|bool. Претходно, ова беше документирано дека има тип на враќање
DOMDocument
, но, од PHP 8.0.0,
параметарот е помал од
Сигнатурата на imagerotate() не може да се врати бидејќи веќе не е статички повикувачки. $ignore_transparent е променето. Параметарот
Меѓународен
datefmt_set_timezone() е отстранет, бидејќи беше игнориран од PHP 5.5.0.
(и неговиот алијасIntlDateformatter::setTimeZone() true ) сега враќа null .
при успех, претходно сега враќа false
IntlBreakiterator::setText() null при неуспех, претходно true ) сега враќа null .
беше вратено. Сега враќа IntlChar::enumCharNames() null на успех и false при неуспех.
ResourceBundle::get() фрла U_ILLEGAL_ARGUMENT_ERROR
сега враќа булева вредност. Претходно враќаше
MBString
mb_strtolower() and mb_convert_case()
исклучок кога беше поставен неважечки локал. mb_convert_case()имплементира условни правила за големи и мали букви за грчката буква сигма. За MB_CASE_LOWER
and MB_CASE_TITLE Имплементирани условни правила за случај за грчката буква сигма кои се применуваат само на
MB_CASE_LOWER_SIMPLE and
MB_CASE_TITLE_SIMPLE.
mb_decode_mimeheader() , условното менување на големи и мали букви се однесува само на "=5F" ги толкува подвлекувањата во MIME кодирани зборови кодирани со QPrint како што се бара со RFC 2047; тие се претвораат во празни места. Подвлекувањата мора да бидат кодирани како
во такви MIME кодирани зборови. mb_encode_mimeheader() ќе го пренесе својот влезен стринг каде што ќе го пропушти како суров ASCII во PHP 8.2.
mb_encode_mimeheader() веќе не испушта NUL (нула) бајти при QPrint-кодирање на влезниот стринг. Ова претходно предизвика стринг во одредени текстуални кодирања, особено UTF-16 и UTF-32, да бидат оштетени од mb_encode_mimeheader.
mb_detect_encoding()„нестрогиот“ режим сега се однесува како што е опишано во документацијата. Претходно, ќе вратеше false ако истиот бајт (на пример, првиот бајт) од влезниот стринг бил невалиден во сите кандидат кодирања. Поопшто, ќе ги елиминира кандидат кодирањата од разгледување кога ќе се види невалиден бајт, и ако истиот влезен бајт ги елиминира сите преостанати кодирања што сè уште се разгледуваат, ќе вратеше false. Од друга страна, ако сите кандидат кодирања освен едно биле елиминирани од разгледување, ќе го вратеше последното преостанато без оглед на тоа колку грешки при кодирање може да се сретнат подоцна во стрингот. Ова се разликува од однесувањето опишано во документацијата, кое вели: „Ако strict е поставен на false, ќе се врати најблиското соодветно кодирање.“
mysqli
mysqli_fetch_object() сега покренува
ValueError наместо Исклучок
кога $constructor_args аргументот не е празен со класа што нема конструктор.
mysqli_poll() сега покренува ValueError
кога ниту $read
ниту $error се фрла кога ниту еден од
mysqli_field_seek() and mysqli_result::field_seek() сега го специфицира типот на враќање како true наместо bool.
ODBC
odbc_autocommit() сега прифаќа null » PEAR
$enable параметар. Проследување null го има истото однесување како проследување само 1 параметар, имено укажувајќи дали функцијата autocommit е овозможена или не.
PGSQL
pg_fetch_object() сега покренува
ValueError наместо Исклучок
кога $constructor_args аргументот не е празен со класа што нема конструктор.
pg_insert() сега покренува ValueError
наместо E_WARNING кога наведената табела е невалидна.
pg_insert() and pg_convert() покренува ValueError или TypeError
наместо E_WARNING кога вредноста/типот на поле не се совпаѓаат правилно со типот на PostgreSQL.
На $row параметарот
pg_fetch_result(),
pg_field_prtlen()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
pg_field_is_null() сега е null.
— Разни функции
Променето mt_srand() and srand() да не го проверува бројот на аргументи за да утврди дали треба да се користи случајно семе. Проследување null ќе генерира случајно семе, 0
ќе користи нула како семе. Функциите сега се конзистентни со
Random\Engine\Mt19937::__construct().
Рефлексија
Тип на враќање на ReflectionClass::getStaticPropertyValue() веќе не е null-абилен.
Стандардно
E_NOTICEs емитувани од unserialize()
се унапредени во E_WARNING.
unserialize() сега емитува нов E_WARNING
ако влезот содржи непрочитани бајти.
array_pad() сега е ограничено само од максималниот број елементи што може да ги има една низа. Претходно, беше можно да се додадат најмногу 1048576 елементи одеднаш.
strtok() крева E_WARNING во случај кога токенот не е обезбеден при започнување на токенизација.
password_hash() сега ќе ги поврзе основните
Random\RandomException
како ValueErrorпри обид за десериализација на недефинирана класа или класа што не е наведена во $previous
Исклучок кога генерирањето сол не успее.
Ако користите низа како $command
for proc_open(), сега мора да има барем еден непразен елемент. Инаку ValueError
се фрла.
proc_open() returns false if $command
низата е неважечка команда наместо ресурс објект што подоцна произведува предупредување. Ова веќе беше случај за Windows, но сега е случај и ако се користи имплементација на posix_spawn (повеќето платформи Linux, BSD и MacOS). Сè уште постојат некои стари платформи каде што ова однесување не е променето бидејќи posix_spawn не е поддржан таму.
array_sum() and array_product() сега предупредува кога вредностите во низата не можат да се претворат во int/float. Претходно, низите и објектите беа игнорирани, додека секоја друга вредност беше претворена во int. Покрај тоа, објектите што дефинираат нумеричка претворање (на пр. GMP) сега се претвораат наместо да се игнорираат.
На $decimals of number_format()
сега правилно ги обработува негативните броеви. Закружувањето со негативна вредност за $decimals значи дека $num се заокружува на $decimals
значајни цифри пред децималната точка. Претходно негативни $decimals беа тивко игнорирани и бројот се закружуваше на нула децимални места.
Нов $before_needle аргументот е додаден на
strrchr(). Се однесува како неговиот пандан во
strstr() or stristr() functions.
str_getcsv() and fgetcsv() сега враќа празен стринг наместо стринг со една нулта бајт за последното поле што содржи само незавршена обвивка.
Други промени во екстензиите
Јадро
Користејќи го increment/decrement
оператори (++/--) на вредности од тип
bool сега испуштаат предупредувања. Ова е затоа што моментално нема ефект, но ќе се однесува како
$bool += 1 во иднина.
Користејќи го decrement
оператор (--) на вредности од тип null сега испуштаат предупредувања. Ова е затоа што моментално нема ефект, но ќе се однесува како
$null -= 1 во иднина.
Внатрешните објекти што имплементираат _IS_NUMBER каст, но не и do_operator рачка што надјачува собирање и одземање, сега можат да се зголемуваат и намалуваат како да се прави $o += 1 or $o -= 1
DOM
Механизмот за животен век на DOM е преработен така што имплицитно отстранетите јазли сè уште можат да се преземат. Претходно ова резултираше со исклучок.
SQLite3
На SQLite3 класата сега фрла SQLite3Exception (се протега Исклучок) наместо Исклучок.
SQLite кодот за грешка сега се предава во кодот за грешка на исклучокот наместо да биде вклучен во пораката за грешка.
Промени во ракувањето со INI датотеки
-
На
Ако вредноста на поставката е еднаква на стандардната вредност, не се емитува известување за укинување. The zend.assertions INI поставката треба да се користи наместо тоа.assert.*INI поставките се укинати. Ова ги вклучува следните INI поставки: -
zend.max_allowed_stack_size е нова INI директива за поставување на максималната дозволена големина на стек. Можни вредности се
0(откриј ја максималната големина на стек на процесот или нишката),-1(без ограничување), или позитивен број на бајти. Стандардно е0. Кога не е можно да се открие максималната големина на стек на процесот или нишката, се користи позната системска стандардна вредност. Поставувањето на оваа вредност премногу високо има исто дејство како оневозможување на ограничувањето на големината на стекот. Влакната користат fiber.stack_size како максимална дозволена големина на стек. Ан Грешка се фрла кога стекот на повици на процесот надминува zend.max_allowed_stack_size-zend.reserved_stack_size бајти, за да се спречат сегментациски грешки предизвикани од прелевање на стекот, со цел да се олесни отстранувањето на грешки. Големината на стекот се зголемува за време на неконтролирани рекурзии што вклучуваат внатрешни функции или магични методи __toString(), __clone(), __sleep(), __destruct(). Ова не е поврзано со прелевање на баферот на стекот и не е безбедносна функција. -
zend.reserved_stack_size е нова INI директива за поставување на резервираната големина на стек, во бајти. Ова се одзема од максималната дозволена големина на стек, како бафер, при проверка на големината на стекот.
Оваа функција е достапна кога PHP е поврзан со библиотеки на Oracle Database од верзија 10
DOM
Повторувањето преку a DOMNodeList сега користи кеширање. Затоа барањето елементи повеќе не трае квадратно време по дифолт.
Добивањето текстуална содржина од јазли сега избегнува распределба, што резултира со добивка во перформансите.
Пример #1 Отстранување на дете сега работи во O(1) перформанси.
Стандардно
На file() проверката на грешките на знамињата сега е околу 7% побрза.
SPL
RecursiveDirectoryIterator сега врши помалку I/O при повторување преку директориум.