PHP.mk документација

Некомпатибилни промени воназад

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

migration80.incompatible.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека migration80.incompatible.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Некомпатибилни промени воназад

Референца за `migration80.incompatible.php` со подобрена типографија и навигација.

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() е отстрането. foreach or 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_NOTICE and E_DEPRECATED.

  • display_startup_errors сега е овозможено по дифолт.

  • Пронајдете и отворете ја конфигурациската датотека на Apache. Стандардно, локацијата е како што следува: parent внатре во класа што нема родител сега ќе резултира со фатална грешка при компајлирање.

  • На @ операторот повеќе нема да ги замолчува фаталните грешки (E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Ракувачите со грешки што очекуваат error_reporting да биде 0 when @ се користи, треба да се прилагодат за да користат проверка на маска наместо:

    <?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() and T2::func() Референците на методи на трајт кои не се апсолутни во адаптациите на новите имиња на методи сега се бара да бидат недвосмислени: T1::func постои, овој код претходно беше тивко прифатен, и func се претпоставуваше дека се однесува на T1::func or T2::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().

  • ,

  • debug_backtrace() and Враќа стек трага од исклучок како не

  • Вгнездени тернарни оператори сега бараат експлицитни загради.

    • На is_numeric() function
    • веќе нема да обезбедува референци до аргументи. Нема да биде можно да се менуваат аргументите на функциите преку backtrace.
    • Декларации на типови
    • Ракувањето со нумерички низи е променето за да биде поинтуитивно и помалку склоно кон грешки. Задното празно место сега е дозволено во нумерички низи за конзистентност со начинот на кој се третира предното празно место. Ова главно влијае на:

    Споредби од низа до низа E_NOTICE Операции за зголемување и намалување E_WARNING Концептот на „нумеричка низа што започнува со број“ е во голема мера отфрлен; случаите каде ова останува постојат за да се олесни миграцијата. Низи кои емитуваа E_WARNING „Пронајдена е невалидна нумеричка вредност“ сега ќе емитува TypeError„Пронајдена е не-нумеричка вредност“ и сите низи кои емитуваа

    • „Пронајдена е не-нумеричка вредност“ сега ќе фрли
    • . Ова главно влијае на:

    Ова E_WARNING to 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.

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 екстензијата што немаа однесување:

Омажи

Exif

read_exif_data() е отстранет; exif_read_data() треба да се користи наместо тоа.

Филтер

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

Меѓународни функции

  • Отповиканата константа INTL_IDNA_VARIANT_2003 е отстрането.

  • Отповиканата Normalizer::NONE константа е отстранета.

LDAP

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 алијаси. Погледнете ја следната листа за тоа кои функции треба да се користат наместо нив:

  • На 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_* and ISO8859_*сега ќе враќаат булова вредност

  • mb_ereg() and mb_eregi() при успешно совпаѓање. Претходно враќаа цел број true не беше предаден, или 1 if matches беше предаден. max(1, strlen($matches[0])) if matches класата сега се нарекува

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() сега исто така враќаат true for __construct() and __destruct() методи на интерфејси. Претходно, ова беше точно само за методи на класи и трајти.

  • ReflectionType::isBuiltin() методот е преместен во ReflectionNamedType. ReflectionUnionType не го има.

Приклучоци

  • Отповиканата AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES flags for socket_addrinfo_lookup() се отстранети.

Стандардна PHP библиотека (SPL)

Стандардна библиотека

  • 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 = null
    • http://example.com/foo? → query = "", fragment = null
    • http://example.com/foo# → query = null, fragment = ""
    • http://example.com/foo?# → query = "", fragment = ""
    Претходно сите случаи резултираа со 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

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),

Windows PHP тест пакети

Тест-трачачот е преименуван од run-test.php to run-tests.php, за да одговара на неговото име во php-src.

Белешки од корисници 2 забелешки

повтори, откажи, неуспех
пред 4 години
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.
aphpguy на galaxy dot za dot net
пред 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.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.