The change in string to int comparison mentioned above (e.g. '' == 0 now equates to false) has some other nasty consequences:
$a = '';
// php 8
if ( $a < 0 ) echo 'true'; // echos true
if ( $a < -1) echo 'true'; // echos true
if ( $a < -100 ) echo 'true'; // echos true
// php 7
if ( $a < 0 ) echo 'true'; // no output
if ( $a < -1) echo 'true'; // no output
if ( $a < -100 ) echo 'true'; // no output
So in a situation where you may have a web form input and expected an empty value to equate to 0, watch out not only for == 0, != 0, and <= 0 comparisons, but ALL < or <= comparisons to negative integers.Некомпатибилни промени воназад
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Некомпатибилни промени воназад
Референца за `migration80.incompatible.php` со подобрена типографија и навигација.
Некомпатибилни промени воназад
PHP јадро
Споредба на стринг со број
Нестрогите споредби помеѓу броеви и не-нумерички стрингови сега работат со претворање на бројот во стринг и споредување на стрингови. Споредбите помеѓу броеви и нумерички стрингови продолжуваат да работат како порано. Особено, ова значи дека 0 == "not-a-number" се смета за лажно сега.
| Споредба | Пред | По |
|---|---|---|
0 == "0" |
true |
true |
0 == "0.0" |
true |
true |
0 == "foo" |
true |
false |
0 == "" |
true |
false |
42 == " 42" |
true |
true |
42 == "42foo" |
true |
false |
Други некомпатибилни промени
-
matchсега е резервиран збор. -
mixedсега е резервиран збор, така што не може да се користи за именување на класа, интерфејс или трејт, а исто така е забрането да се користи во имиња на простори. -
Грешките при проверка сега фрлаат по дифолт. Ако се посакува старото однесување,
assert.exception=0може да се постави во INI поставките. -
Методите со исто име како класата веќе не се толкуваат како конструктори. Методот __construct() треба да се користи наместо тоа.
-
Отстранета е можноста за статично повикување на нестатични методи. Така is_callable() ќе пропадне при проверка на нестатичен метод со име на класа (мора да се провери со инстанца на објект).
-
На
(real)and(unset)претворањата се отстранети. -
На track_errors ini директивата е отстранета. Ова значи дека php_errormsg веќе не е достапна. Функцијата error_get_last() може да се користи наместо тоа.
-
Отстранета е можноста за дефинирање на константи кои не разликуваат големи и мали букви. Третиот аргумент на define() веќе не може да биде
true. -
Отстранета е можноста за специфицирање на автолоадер користејќи __autoload() функцијата е отстранета. spl_autoload_register() треба да се користи наместо тоа.
-
На
errcontextаргументот веќе нема да се проследува до прилагодени ракувачи на грешки поставени со set_error_handler(). -
create_function() е отстранета. Наместо тоа, може да се користат анонимни функции.
-
each() е отстрането.
foreachor ArrayIterator треба да се користи наместо тоа. -
Способноста за отпишување this од затворања што беа создадени од метод, користејќи има исти семантики како or ReflectionMethod::getClosure(), е отстранета.
-
Способноста за отпишување this од соодветни затворања што содржат употреби на this исто така е отстранета.
-
Способноста да се користи array_key_exists() со објекти е отстранета. isset() or property_exists() може да се користи наместо тоа.
-
Однесувањето на array_key_exists() во однос на типот на
keyпараметарот е усогласен со isset() и нормален пристап до низа. Сите типови на клучеви сега ги користат вообичаените принудувања, а клучевите на низата/објектот фрлаат TypeError. -
Секоја низа што има број n како прв нумерички клуч ќе користи n+1 за својот следен имплицитен клуч, дури и ако n е негативен.
-
Стандардното ниво на error_reporting сега е
E_ALL. Претходно исклучувашеE_NOTICEandE_DEPRECATED. -
display_startup_errors сега е овозможено по дифолт.
-
Пронајдете и отворете ја конфигурациската датотека на Apache. Стандардно, локацијата е како што следува: parent внатре во класа што нема родител сега ќе резултира со фатална грешка при компајлирање.
-
На
@операторот повеќе нема да ги замолчува фаталните грешки (E_ERROR,E_CORE_ERROR,E_COMPILE_ERROR,E_USER_ERROR,E_RECOVERABLE_ERROR,E_PARSE). Ракувачите со грешки што очекуваат error_reporting да биде0when@се користи, треба да се прилагодат за да користат проверка на маска наместо:<?php
// Replace
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (error_reporting() == 0) {
return false;
}
// ...
}
// With
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false;
}
// ...
}
?>Дополнително, треба да се внимава пораките за грешки да не се прикажуваат во продукциски средини, што може да резултира со протекување информации. Ве молиме осигурете се дека
display_errors=Offсе користи во комбинација со евидентирање на грешки. -
#[веќе не се толкува како почеток на коментар, бидејќи оваа синтакса сега се користи за атрибути. -
Грешките во наследувањето поради некомпатибилни потписи на методи (прекршувања на LSP) сега секогаш ќе генерираат фатална грешка. Претходно во некои случаи се генерираше предупредување.
-
Прецедентноста на операторот за конкатенација е променета во однос на битовите поместувања и собирањето, како и одземањето.
<?php
echo "Sum: " . $a + $b;
// was previously interpreted as:
echo ("Sum: " . $a) + $b;
// is now interpreted as:
echo "Sum:" . ($a + $b);
?> -
Аргументите со вредност по дифолт што се решаваат на
nullпри извршување повеќе нема имплицитно да го означува типот на аргументот како нулти. Или експлицитен нулти тип, или експлицитенnullвредност по дифолт мора да се користи наместо тоа.<?php
// Replace
function test(int $arg = CONST_RESOLVING_TO_NULL) {}
// With
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
// Or
function test(int $arg = null) {}
?> -
Голем број предупредувања се претворени во Грешка исклучоци:
- Обид за запишување во својство на не-објект. Претходно ова имплицитно создаваше stdClass објект за null, false и празни низи.
- Обид за додавање елемент во низа за која клучот PHP_INT_MAX веќе се користи.
- Обид за користење на неважечки тип (низа или објект) како клуч на низа или офсет на низа.
- Обид за запишување во индекс на низа од скаларна вредност.
- Обид за распакување на не-низа/Traversable.
- Обид за пристап до неопределени константи кои не се дефинирани. Претходно, пристапот до неопределени константи резултираше со предупредување и се толкуваше како низи.
- Поминување на погрешен број аргументи на вградена функција што не е варијадна ќе фрли ArgumentCountError.
- Поминување на невалидни броени типови на count() ќе фрли TypeError.
Голем број известувања се претворени во предупредувања:
- Обид за читање на недефинирана променлива.
- Обид за читање на недефинирана својство.
- Обид за читање на недефиниран клуч на низа.
- Обид за читање на својство на не-објект.
- Обид за пристап до индекс на низа на не-низа.
- Обид за конвертирање на низа во низа.
- Обид за користење ресурс како клуч на низа.
- Обид за користење null, boolean или float како офсет на низа.
- Обид за читање на офсет на низа надвор од границите.
- Обид за доделување празна низа на офсет на низа.
-
Доделувањето на повеќе бајти на офсет на низа сега ќе емитува предупредување.
-
Неочекувани знаци во изворните датотеки (како NUL бајти надвор од низи) сега ќе резултираат со ParseError исклучок наместо предупредување при компилација.
-
Нефатените исклучоци сега поминуваат низ „чисто исклучување“, што значи дека деструкторите ќе бидат повикани по нефатен исклучок.
-
The compile time fatal error "Only variables can be passed by reference" has been delayed until runtime, and converted into an "Argument cannot be passed by reference" Грешка exception.
-
Фаталната грешка при компајлирање "Only variables can be passed by reference" е одложена до времето на извршување и претворена во "Argument cannot be passed by reference"
-
Некои известувања "Only variables should be passed by reference" се претворени во исклучок "Argument cannot be passed by reference".
<?php
new class extends ParentClass {};
// -> ParentClass@anonymous
new class implements FirstInterface, SecondInterface {};
// -> FirstInterface@anonymous
new class {};
// -> class@anonymous
?>Генерираното име за анонимни класи е променето. Сега ќе го вклучува името на првиот родител или интерфејс:
-
Името прикажано погоре сè уште е проследено со NUL бајт и уникатен суфикс.
<?php
class X {
use T1, T2 {
func as otherFunc;
}
function func() {}
}
?>Ако и двете
T1::func()andT2::func()Референците на методи на трајт кои не се апсолутни во адаптациите на новите имиња на методи сега се бара да бидат недвосмислени:T1::funcпостои, овој код претходно беше тивко прифатен, и func се претпоставуваше дека се однесува наT1::funcorT2::func. Сега наместо тоа ќе генерира фатална грешка, и или -
мора експлицитно да се напише.
<?php
trait MyTrait {
abstract private function neededByTrait(): string;
}
class MyClass {
use MyTrait;
// Error, because of return type mismatch.
private function neededByTrait(): int { return 42; }
}
?> -
Сигнатурата на апстрактните методи дефинирани во трајтови сега се проверува со методот на имплементирачката класа:
-
data://Оневозможените функции сега се третираат исто како и непостоечките функции. Повикувањето на оневозможена функција ќе се пријави како непознато, а предефинирањето на оневозможена функција сега е можно. -
stream wrappers повеќе не се запишуваат, што одговара на документираното однесување.
+,-,*,/,**,%,<<,>>,&,|,^,~,++,--Аритметичките и битовите оператори TypeError сега доследно ќе фрлаат array, resource кога еден од операндите е objectили не-преоптоварен+. Единствен исклучок од ова е операцијата за спојување на низи -
array merge, која останува поддржана.
<?php
setlocale(LC_ALL, "de_DE");
$f = 3.14;
echo $f, "\n";
// Previously: 3,14
// Now: 3.14
?>Константи за известување за грешки printf(), number_format() and NumberFormatter() Претворањето на float во стринг сега секогаш ќе се однесува независно од локалот.
-
за начини за прилагодување на форматирањето на броевите.
<?php
// Instead of:
$array{0};
$array{"key"};
// Write:
$array[0];
$array["key"];
?> -
Applying the final modifier on a private method will now produce a warning unless that method is the constructor.
-
Примената на последниот модификатор на приватен метод сега ќе произведе предупредување освен ако тој метод не е конструктор. exit()Ако конструктор на објект
-
s, деструкторот на објектот повеќе нема да се повикува. Ова го одразува однесувањето кога конструкторот фрла исклучок.
Foo\BarИмињата во именски простор повеќе не можат да содржат празно место: ДодекаFoo \ Barќе се препознае како име во именски простор,new\xнема. Спротивно на тоа, резервираните клучни зборови сега се дозволени како сегменти на именски простор, што исто така може да ја промени интерпретацијата на кодот:constant('new\x')сега е исто какоnew \x(). -
,
-
Вгнездени тернарни оператори сега бараат експлицитни загради.
- На is_numeric() function
- веќе нема да обезбедува референци до аргументи. Нема да биде можно да се менуваат аргументите на функциите преку backtrace.
- Декларации на типови
- Ракувањето со нумерички низи е променето за да биде поинтуитивно и помалку склоно кон грешки. Задното празно место сега е дозволено во нумерички низи за конзистентност со начинот на кој се третира предното празно место. Ова главно влијае на:
Споредби од низа до низа
E_NOTICEОперации за зголемување и намалувањеE_WARNINGКонцептот на „нумеричка низа што започнува со број“ е во голема мера отфрлен; случаите каде ова останува постојат за да се олесни миграцијата. Низи кои емитувааE_WARNING„Пронајдена е невалидна нумеричка вредност“ сега ќе емитува TypeError„Пронајдена е не-нумеричка вредност“ и сите низи кои емитуваа- „Пронајдена е не-нумеричка вредност“ сега ќе фрли
- . Ова главно влијае на:
Ова
E_WARNINGto TypeError промената исто така влијае наE_WARNING"Illegal string offset 'string'" за нелегални низови офсети. Однесувањето на експлицитните кастинзи во int/float од низови не е променето. -
Магичните методи сега ќе ги проверуваат нивните аргументи и типови на враќање ако ги имаат декларирано. Сигнатурите треба да одговараат на следната листа:
__call(string $name, array $arguments): mixed__callStatic(string $name, array $arguments): mixed__clone(): void__debugInfo(): ?array__get(string $name): mixed__invoke(mixed $arguments): mixed__isset(string $name): bool__serialize(): array__set(string $name, mixed $value): void__set_state(array $properties): object__sleep(): array__unserialize(array $data): void__unset(string $name): void__wakeup(): void
-
call_user_func_array() клучовите на низот сега ќе се толкуваат како имиња на параметри, наместо да се игнорираат тивко.
-
Декларирање на функција наречена
assert()внатре во именски простор веќе не е дозволено, и проблемиE_COMPILE_ERRORќе треба да се прилагоди, и assert() функцијата е предмет на посебно ракување од страна на моторот, што може да доведе до недоследно однесување при дефинирање на именски простор со иста функција.
Миграција на ресурси во објекти
Неколку resourceи се мигрирани во object. Проверките на вратената вредност користејќи is_resource() треба да се заменат со проверки за false.
-
curl_init() сега ќе врати CurlHandle објект наместо resourceќе треба да се прилагоди, и curl_close() функцијата веќе нема ефект, наместо тоа CurlHandle инстанцата автоматски се уништува ако повеќе не се повикува.
-
curl_multi_init() сега ќе врати CurlMultiHandle објект наместо resourceќе треба да се прилагоди, и curl_multi_close() функцијата веќе нема ефект, наместо тоа CurlMultiHandle инстанцата автоматски се уништува ако повеќе не се повикува.
-
curl_share_init() сега ќе врати CurlShareHandle објект наместо resourceќе треба да се прилагоди, и curl_share_close() функцијата веќе нема ефект, наместо тоа CurlShareHandle инстанцата автоматски се уништува ако повеќе не се повикува.
-
enchant_broker_init() сега ќе врати EnchantBroker објект наместо resource.
-
enchant_broker_request_dict() and enchant_broker_request_pwl_dict() сега ќе врати EnchantDictionary објект наместо resource.
-
GD екстензијата сега користи GdImage објекти како основна структура на податоци за слики, наместо resource. На imagedestroy() функцијата веќе нема ефект; наместо тоа GdImage инстанцата автоматски се уништува ако повеќе не се повикува.
-
openssl_x509_read() and openssl_csr_sign() сега ќе врати OpenSSLCertificate објект наместо resourceќе треба да се прилагоди, и openssl_x509_free() функцијата е застарена и веќе нема ефект, наместо тоа OpenSSLCertificate инстанцата автоматски се уништува ако повеќе не се повикува.
-
openssl_csr_new() сега ќе врати OpenSSLCertificateSigningRequest објект наместо resource.
-
openssl_pkey_new() сега ќе врати OpenSSLAsymmetricKey објект наместо resourceќе треба да се прилагоди, и openssl_pkey_free() функцијата е застарена и веќе нема ефект, наместо тоа OpenSSLAsymmetricKey инстанцата автоматски се уништува ако повеќе не се повикува.
-
shmop_open() сега ќе врати Функции за споделена меморија објект наместо resourceќе треба да се прилагоди, и shmop_close() функцијата веќе нема ефект и е застарена; наместо тоа Функции за споделена меморија инстанцата автоматски се уништува ако повеќе не се повикува.
-
socket_create(), socket_create_listen(), socket_accept(), socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во socket_wsaprotocol_info_import() сега ќе врати Сокет објект наместо resource. socket_addrinfo_lookup() сега ќе враќа низа од AddressInfo објекти наместо resources.
-
msg_get_queue() сега ќе врати SysvMessageQueue објект наместо resource.
-
sem_get() сега ќе врати SysvSemaphore објект наместо resource.
-
shm_attach() сега ќе врати SysvSharedMemory објект наместо resource.
-
xml_parser_create() and xml_parser_create_ns() сега ќе врати XMLParser објект наместо resourceќе треба да се прилагоди, и xml_parser_free() функцијата веќе нема ефект, наместо тоа инстанцата XMLParser автоматски се уништува ако повеќе не се повикува.
-
На XMLWriter функциите сега прифаќаат и враќаат, соодветно, XMLWriter објекти наместо resources.
-
inflate_init() сега ќе врати InflateContext објект наместо resource.
-
deflate_init() сега ќе врати DeflateContext објект наместо resource.
COM и .Net (Windows)
Отстранета е можноста за увоз на константи од типски библиотеки што не прават разлика помеѓу големи и мали букви. Вториот аргумент на com_load_typelib() веќе не може да биде false; com.autoregister_casesensitive веќе не може да биде оневозможено; маркерите што не прават разлика помеѓу големи и мали букви во com.typelib_file се игнорираат.
CURL
CURLOPT_POSTFIELDS веќе не прифаќа објекти како низи. За да се толкува објект како низа, извршете експлицитно (array) префрлање. Истото важи и за други опции што прифаќаат низи.
Датум и време
mktime() and gmmktime() сега бараат барем еден аргумент. time() може да се користи за добивање на тековниот временски печат.
DOM
Отстранети се неостварени класи од DOM екстензијата што немаа однесување и содржеа тест податоци. Овие класи се отстранети и во најновата верзија на DOM стандардот:
- DOMNameList
- DomImplementationList
- DOMConfiguration
- DomError
- DomErrorHandler
- DOMImplementationSource
- DOMLocator
- DOMUserDataHandler
- DOMTypeInfo
- DOMStringExtend
Отстранети се неостварени методи од DOM екстензијата што немаа однесување:
- DOMNamedNodeMap::setNamedItem()
- DOMNamedNodeMap::removeNamedItem()
- DOMNamedNodeMap::setNamedItemNS()
- DOMNamedNodeMap::removeNamedItemNS()
- DOMText::replaceWholeText()
- Јазол за кој треба да се спореди позицијата, во однос на овој јазол.
- (PHP 8 >= 8.3.0)
- DOMNode::getFeature()
- DOMNode::setUserData()
- DOMNode::getUserData()
- DOMDocument::renameNode()
Омажи
-
enchant_broker_list_dicts(), enchant_broker_describe() and enchant_dict_suggest() сега ќе враќа празен список наместо
null.
Exif
read_exif_data() е отстранет; exif_read_data() треба да се користи наместо тоа.
Филтер
-
На
FILTER_FLAG_SCHEME_REQUIREDandFILTER_FLAG_HOST_REQUIREDзнаменца заFILTER_VALIDATE_URLфилтерот се отстранети. Наschemeandhostсе (и отсекогаш биле) секогаш потребни. -
На
INPUT_REQUESTandINPUT_SESSIONизвор за filter_input() итн. се отстранети. Тие никогаш не беа имплементирани и нивната употреба секогаш генерираше предупредување.
GD
-
Отповиканата функција image2wbmp() е отстрането.
-
Отповиканите функции png2wbmp() and jpeg2wbmp() се отстранети.
-
Стандардното
modeпараметарот imagecropauto() веќе не прифаќа-1.IMG_CROP_DEFAULTтреба да се користи наместо тоа. -
На Windows, php_gd2.dll е преименувана во php_gd.dll.
GMP
gmp_random() е отстрането. Едно од gmp_random_range() or gmp_random_bits() треба да се користи наместо тоа.
Iconv
iconv имплементации кои не поставуваат правилно errno во случај на грешки повеќе не се поддржани.
IMAP
-
Неискористениот
default_hostаргументот на imap_headerinfo() е отстрането. -
На imap_header() функција која е алијас на imap_headerinfo() е отстрането.
Меѓународни функции
-
Отповиканата константа
INTL_IDNA_VARIANT_2003е отстрането. -
Отповиканата
Normalizer::NONEконстанта е отстранета.
LDAP
-
Отповиканите функции ldap_sort(), ldap_control_paged_result() and ldap_control_paged_result_response() се отстранети.
-
Интерфејсот на ldap_set_rebind_proc() се промени; на
callbackпараметарот повеќе не прифаќа празни низи;nullтреба да се користи наместо тоа.
MBString
-
На mbstring.func_overload директивата е отстранета. Поврзаните
MB_OVERLOAD_MAIL,MB_OVERLOAD_STRINGПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци воMB_OVERLOAD_REGEXконстанти се исто така отстранети. Конечно,"func_overload"and"func_overload_list"записите во mb_get_info() се отстранети. -
mb_parse_str() веќе не може да се користи без специфицирање на резултирачка низа.
-
Отстранет е број на отповикани mbregex алијаси. Погледнете ја следната листа за тоа кои функции треба да се користат наместо нив:
- mbregex_encoding() → mb_regex_encoding()
- mbereg() → mb_ereg()
- mberegi() → mb_eregi()
- mbereg_replace() → mb_ereg_replace()
- mberegi_replace() → mb_eregi_replace()
- mbsplit() → mb_split()
- mbereg_match() → mb_ereg_match()
- mbereg_search() → mb_ereg_search()
- mbereg_search_pos() → mb_ereg_search_pos()
- mbereg_search_regs() → mb_ereg_search_regs()
- mbereg_search_init() → mb_ereg_search_init()
- mbereg_search_getregs() → mb_ereg_search_getregs()
- mbereg_search_getpos() → mb_ereg_search_getpos()
- mbereg_search_setpos() → mb_ereg_search_setpos()
-
На
eмодификатор за mb_ereg_replace() е отстрането. mb_ereg_replace_callback() треба да се користи наместо тоа. -
Не-низа аргумент за шема на mb_ereg_replace() сега ќе се толкува како низа наместо како ASCII кодна точка. Претходното однесување може да се врати со експлицитен повик до chr().
-
На
needleаргумент за mb_strpos(), mb_strrpos(), mb_stripos(), mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr() and mb_strrichr() може сега да биде празно. -
На
is_hexпараметарот, кој не беше искористен внатрешно, е отстранет од mb_decode_numericentity(). -
Наследеното однесување на поминување на кодирањето како трет аргумент наместо поместување за mb_strrpos() функцијата е отстранета; експлицитно
0треба да се обезбеди поместување со кодирањето како четврти аргумент наместо тоа. -
На
ISO_8859-*новите имиња на кодирањето на знаци се заменети соISO8859-*новите имиња за подобра интероперабилност со екстензијата iconv. Исто така, беа отстранети ISO 8859 алијасите на mbregex со подвлекувања (ISO_8859_*andISO8859_*сега ќе враќаат булова вредност -
mb_ereg() and mb_eregi() при успешно совпаѓање. Претходно враќаа цел број
trueне беше предаден, или1ifmatchesбеше предаден.max(1, strlen($matches[0]))ifmatchesкласата сега се нарекува
OCI8
-
На OCI-Lob за усогласување на имињата наметнато од алатките за анотација на типови на аргументи на PHP 8. OCILobФункциите OCI-Collection за усогласување на имињата наметнато од алатките за анотација на типови на аргументи на PHP 8. OCICollection Неколку алијас функции се означени како застарени.
-
и неговиот алијас
-
oci_internal_debug() веќе не повторно користи врски. ociinternaldebug() се отстранети.
ODBC
-
odbc_connect() сега бараат
-
Неискористениот
flagsпараметарот odbc_exec() е отстрането.
OpenSSL
-
openssl_seal() and openssl_open() да се предаде, бидејќи претходната стандардна вредност од
methodсе смета за несигурна."RC4"is considered insecure.
Регуларни изрази (компатибилни со Perl)
Кога се проследуваат невалидни секвенци за бегство, тие повеќе не се толкуваат како букви. Ова однесување претходно бараше X модификатор – кој сега е игнориран.
PHP Објекти за податоци
-
Стандардниот режим за ракување со грешки е променет од „тивок“ во „исклучоци“. Види Грешки и ракување со грешки интерполација на низи
-
Сигнатурите на некои PDO методи се променети:
PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)PDOStatement::setFetchMode(int $mode, mixed ...$args)
PDO ODBC
На php.ini directive pdo_odbc.db2_instance_name е отстрането.
PDO MySQL
PDO::inTransaction() сега известува за вистинската состојба на трансакцијата на врската, наместо за приближување одржано од PDO. Ако се изврши прашање што е предмет на „имплицитно потврдување“, PDO::inTransaction()
подоцна ќе врати false, бидејќи трансакцијата повеќе не е активна.
PostgreSQL
-
Отповиканата pg_connect() синтаксис со повеќе параметри наместо стринг за поврзување повеќе не се поддржува.
-
Отповиканата pg_lo_import() and pg_lo_export() сигнатура што ја проследува врската како последен аргумент повеќе не се поддржува. Врската треба да се проследи како прв аргумент наместо тоа.
-
pg_fetch_all() сега ќе враќа празен список наместо
falseза множества со нула редови.
Phar
Метаподатоците поврзани со phar повеќе нема автоматски да се десериализираат, за да се поправат потенцијалните безбедносни ранливости поради инстанцирање објекти, вчитување итн.
Рефлексија
-
Сигнатурите на методите
ReflectionClass::newInstance($args)ReflectionFunction::invoke($args)ReflectionMethod::invoke($object, $args)
се променети во:
ReflectionClass::newInstance(...$args)ReflectionFunction::invoke(...$args)ReflectionMethod::invoke($object, ...$args)
Кодот што мора да биде компатибилен и со PHP 7 и со PHP 8 може да ги користи следните сигнатури за да биде компатибилен со двете верзии:
ReflectionClass::newInstance($arg = null, ...$args)ReflectionFunction::invoke($arg = null, ...$args)ReflectionMethod::invoke($object, $arg = null, ...$args)
-
На ReflectionType::__toString() методот сега ќе врати целосна претстава за дебагирање на типот, и повеќе не е застарен. Особено, резултатот ќе вклучува индикатор за nullability за nullability типови. Форматот на вратената вредност не е стабилен и може да се промени помеѓу PHP верзиите.
-
Методите Reflection export() се отстранети. Наместо тоа, објектите за рефлексија можат да се претворат во стринг.
-
ReflectionMethod::isConstructor() and ReflectionMethod::isDestructor() сега исто така враќаат
truefor __construct() and __destruct() методи на интерфејси. Претходно, ова беше точно само за методи на класи и трајти. -
ReflectionType::isBuiltin() методот е преместен во ReflectionNamedType. ReflectionUnionType не го има.
Приклучоци
-
Отповиканата
AI_IDN_ALLOW_UNASSIGNEDandAI_IDN_USE_STD3_ASCII_RULESflagsfor socket_addrinfo_lookup() се отстранети.
Стандардна PHP библиотека (SPL)
-
Зема ред од датотека и ги отстранува HTML таговите е отстрането.
-
- Земете го бројот на редот сега секогаш бара до почетокот на линијата. Претходно, позициите
>=1бараа до почетокот на следната линија. -
SplHeap::compare() сега специфицира потпис на метод. Класите што наследуваат и го имплементираат овој метод сега ќе мора да користат компатибилен потпис на метод.
-
SplDoublyLinkedList::push(), SplDoublyLinkedList::unshift() and SplQueue::enqueue() сега враќаат void наместо
true. -
spl_autoload_register() Овој параметар се игнорира од PHP 8.0.0, и ќе се емитува известување ако е поставен на TypeError на невалидни аргументи, затоа вториот аргумент
do_throwсе игнорира и ќе се емитува известување ако е поставен наfalse. -
SplFixedArray сега е IteratorAggregate и не е Итератор. SplFixedArray::rewind(), SplFixedArray::current(), SplFixedArray::key(), SplFixedArray::next()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во SplFixedArray::valid() се отстранети. На нивно место, SplFixedArray::getIterator() е додадено. Секој код што користи експлицитна итерација над SplFixedArray сега мора да добие Итератор through SplFixedArray::getIterator(). This means that SplFixedArray сега е безбедно да се користи во вгнездени циклуси.
Стандардна библиотека
-
assert() повеќе нема да оценува аргументи од тип стринг, наместо тоа ќе се третираат како кој било друг аргумент.
assert($a == $b)треба да се користи наместоassert('$a == $b')ќе треба да се прилагоди, и assert.quiet_eval ini директива иASSERT_QUIET_EVALконстантата исто така се отстранети, бидејќи веќе нема да имаат никаков ефект. -
parse_str() веќе не може да се користи без специфицирање на резултирачка низа.
-
На string.strip_tags филтерот е отстранет.
-
На
needleаргументот на strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во stristr() сега секогаш ќе се толкува како стринг. Претходно, игличките што не се стринг се толкуваа како ASCII кодна точка. Експлицитен повик до chr() може да се користи за враќање на претходното однесување. -
На
needleаргумент за strpos(), strrpos(), stripos(), strripos(), strstr(), stristr() and strrchr() може сега да биде празно. -
На
lengthаргумент за substr(), substr_count(), substr_compare()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во iconv_substr() сега може да бидеnull.nullвредностите ќе се однесуваат како да не е обезбеден аргумент за должина и затоа ќе го вратат остатокот од стринг наместо празен стринг. -
На
lengthаргумент за array_splice() сега може да бидеnull.nullвредностите ќе се однесуваат идентично како изоставување на аргументот, со што ќе се отстрани сè одoffsetдо крајот на низата. -
На
argsаргументот на vsprintf(), vfprintf()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во vprintf() мора да биде низа. Претходно беше прифатен каков било тип. -
На
'salt'опцијата за password_hash() веќе не се поддржува. Ако'salt'опцијата се користи, се генерира предупредување, обезбедениот сол се игнорира и наместо тоа се користи генериран сол. -
На quotemeta() функцијата сега ќе врати празен стринг ако бил предаден празен стринг. Претходно
false. -
Отстранети се следните функции:
-
FILTER_SANITIZE_MAGIC_QUOTESе отстрането. -
Повикување implode() со параметри во обратен редослед
($pieces, $glue)веќе не се поддржува. -
parse_url() сега ќе ги разликува отсутен и празен query и fragment:
http://example.com/foo → query = null, fragment = nullhttp://example.com/foo? → query = "", fragment = nullhttp://example.com/foo# → query = null, fragment = ""http://example.com/foo?# → query = "", fragment = ""
null. -
var_dump() and debug_zval_dump() сега ќе печати броеви со пловечка точка користејќи serialize_precision отколку precision. Во стандардна конфигурација, ова значи дека броевите со пловечка точка сега се печатат со полна точност од овие функции за дебагирање.
-
Ако низата вратена од __sleep() содржи непостоечки својства, тие сега тивко се игнорираат. Претходно, таквите својства би биле серијализирани како да имале вредност
null. -
Стандардната локација при стартување сега е секогаш
"C". Стандардно, локациите не се наследуваат од околината. Претходно,LC_ALLбеше поставено на"C", додекаLC_CTYPEбеше наследено од околината. Сепак, некои функции не ја почитуваа наследената локација без експлицитно setlocale() call. Експлицитна setlocale() повик сега е секогаш потребен ако компонентата за локација треба да се промени од стандардната. -
Отпаднатиот DES fallback во crypt() е отстранет. Ако на се проследи непознат формат на сол во crypt(), функцијата ќе откаже со
*0наместо да се врати на слаб DES хеш сега. -
Наведувањето на рунди надвор од опсег за SHA256/SHA512 crypt() сега ќе откаже со
*0наместо да се прицврсти на најблиската граница. Ова одговара на однесувањето на glibc. -
Резултатот од функциите за сортирање може да се промени, ако низата содржи елементи што се споредуваат како еднакви.
-
Сите функции што прифаќаат повици што не се експлицитно наведени да прифаќаат параметри по референца сега ќе предупредат ако се користи повик со параметри по референца. Примерите вклучуваат array_filter() and array_reduce(). Ова веќе беше случај за повеќето, но не за сите, функции претходно.
-
HTTP стрим обвивката како што се користи од функции како file_get_contents() сега рекламира HTTP/1.1 наместо HTTP/1.0 по дифолт. Ова не го менува однесувањето на клиентот, но може да предизвика серверите да одговорат поинаку. За да го задржите старото однесување, поставете го
'protocol_version'опцијата за контекст на стрим, на пр.<?php
$ctx = stream_context_create(['http' => ['protocol_version' => '1.0']]);
echo file_get_contents('http://example.org', false, $ctx);
?> -
Повикување crypt() без експлицитна сол веќе не се поддржува. Ако сакате да произведете силен хеш со автоматски генерирана сол, користете password_hash() instead.
-
substr(), mb_substr(), iconv_substr() and grapheme_substr() сега доследно ги прицврстува офсетите надвор од границите до границата на низата. Претходно,
falseсе враќаше наместо празна низа во некои случаи. -
На Windows, функциите за извршување на програми (proc_open(), exec(), popen() итн.) користејќи го шелот, сега доследно извршуваат %comspec% /s /c "$commandline", што има ист ефект како извршување $commandline (без дополнителни наводници).
Sysvsem
-
На
auto_releaseпараметарот sem_get() беше променет да прифаќа булови вредности наместо цели броеви.
Swoole
-
На
use_include_pathпараметарот, кој не беше искористен внатрешно, е отстранет од tidy_repair_string(). -
Враќа поправениот стринг, или and - Парсирај документ зачуван во стринг станаа статични методи.
Tidy
-
T_COMMENTтокените повеќе нема да вклучуваат последничен нов ред. Новиот ред наместо тоа ќе биде дел од следниотT_WHITESPACEтокен. Треба да се напомене декаT_COMMENTне секогаш е проследено со празно место, може да биде проследено и соT_CLOSE_TAGили крај на датотеката. -
Имињата во именски простор сега се претставени со помош на
T_NAME_QUALIFIED(Foo\Bar),T_NAME_FULLY_QUALIFIED(\Foo\Bar) иT_NAME_RELATIVE(namespace\Foo\Bar) токени.T_NS_SEPARATORсе користи само за самостојни разделници на именски простор, и е синтаксички валиден само во комбинација со декларации за групно користење.
XMLReader
NumberFormatter::__construct() and XMLReader::open() сега се статични методи. Тие сè уште можат да се повикуваат како методи на инстанца, но наследните класи треба да ги декларираат како статични ако ги надминат овие методи.
XML-RPC
Проширувањето XML-RPC е преместено во PECL и повеќе не е дел од дистрибуцијата на PHP.
candido1212 на yahoo точка com точка br
ZipArchive::OPSYS_Z_CPM е отстрането (ова име беше печатна грешка). Користете
ZipArchive::OPSYS_CPM instead.
(libcurl >= 8.7.0),
-
gzgetss() е отстрането.
-
zlib.output_compression веќе не е автоматски оневозможено за
Content-Type: image/*.
Windows PHP тест пакети
Тест-трачачот е преименуван од run-test.php to run-tests.php, за да одговара на неговото име во php-src.
Белешки од корисници 2 забелешки
If you have older projects that break with PHP7 to 8 migration due to the loose comparison issue:
i.e. if ($a == 0) different behaviour between PHP 7 and PHP 8
(for case like $a = "" or $a = "123foo" and other cases listed at top)
replace in old code:
if ($a == 0) { .. }
with
if (cmp_eq($a, $b)) { .. }
Tested with a wide range of scenarios, even against arrays, booleans, file handles, pipe handles, objects, scalars and numbers.
So old code still behave like before.
Then both PHP8.x and older PHP up to ver 7.x will give the exact same boolean true or false output for loose comparisons.
function cmp_eq($a, $b) {
// If both $a and $b are of type strings, compare them as strings
if (is_string($a) && is_string($b)) { return $a == $b; } // may not be === because php says '42' equals '042' true yet '42' === '042' is false.
// If both $a and $b are numeric strings, compare them as numbers
if (is_numeric($a) && is_numeric($b)) { return $a == $b; }
// If $a is an empty string and $b is 0, or vice versa, return true
if (($a === '' && $b === 0) || ($a === 0 && $b === '')) { return true; }
// If $a is a non-numeric string and $b is 0, or vice versa, return true
if ((is_string($a) && ($a !== '') && ($b === 0)) || (($a === 0) && is_string($b) && ($b !== ''))) {
return true;
}
// special case '123abc' == 123 .. php 7 casts 123abc to 123, then 123 == 123 results in true. lets mimic that.
if ((is_string($a) && ($a !== '') && (is_numeric($b)) && ((bool)$b))) {
$number = filter_var($a, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); //"-234.56xyz"
return $number == $b;
}
if (is_numeric($a) && ((bool)$a) && is_string($b) && ($b !== '')) {
$number = filter_var($b, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); //"-234.56xyz"
return $a == $number;
}
// If $a is a number and $b is a non-numeric string, cast $a to string and compare
if (is_numeric($a) && is_string($b)) { return strval($a) == $b; }
// If $b is a number and $a is a non-numeric string, cast $b to string and compare
if (is_string($a) && is_numeric($b)) { return $a == strval($b); }
// If $a and $b are both non-numeric strings, compare them directly, we should return true if they are the same
return $a == $b;
} // end func cmp_eq
Note: the better way would be to port code to PHP 8, use strict variable typing and rather make use of the === and !== operators.
But in some cases having lots of old code to quickly patch, this might help.