Зміни, що ламають зворотну сумісність

Ядро PHP

Порівняння рядків з числами

Нестрогі порівняння чисел і нечислових рядків тепер працюють, як перетворення числа на рядок з наступним порівнянням рядків. Порівняння чисел та числових рядків працює, як і раніше. Зокрема, це означає, що 0 == "not-a-number" Тепер видасть false.

СравнениеДоПосле
0 == "0"truetrue
0 == "0.0"truetrue
0 == "foo"truefalse
0 == ""truefalse
42 == " 42"truetrue
42 == "42foo"truefalse

Інші зміни, що ламають зворотну сумісність

  • matchтепер зарезервоване ключове слово.

  • mixedтепер зарезервоване слово, тому його не можна використовувати для назви класу, інтерфейсу чи риси, а також заборонено використовувати у просторах імен.

  • Помилки тверджень (assertions) тепер викидаються за умовчанням. Якщо краща стара поведінка,assert.exception=0можна встановити в INI-налаштуваннях.

  • Методи з тим самим ім'ям, як і клас, більше не інтерпретуються як конструктори. Натомість слід використовувати метод__construct()

  • Можливість статичного виклику нестатичних методів видалено. Таким чином,is_callable()завершиться помилкою під час перевірки нестатичного методу з ім'ям класу (необхідно перевіряти з екземпляром об'єкта).

  • Приведення типів(real)и(unset)видалено.

  • INI-директиваtrack_errorsвидалено. Це означає, що php_errormsg більше не є актуальним. Замість нього можна використовувати функціюerror_get_last()

  • Можливість визначати константи без урахування регістру було видалено. Третій аргументdefine()більше не може бути**true**

  • Можливість вказувати автозавантажувач за допомогою функції__autoload()було видалено. Натомість слід використовуватиspl_autoload_register()

  • Аргументerrcontextбільше не передається в користувальницькі обробники помилок, заданих за допомогоюset_error_handler()

  • create_function()було видалено. Замість неї можна використовувати анонімні функції.

  • each()було видалено. Замість неї можна використовуватиforeach або ArrayIterator

  • Можливість відв'язати це від замикань, які були створені з методу з використаннямClosure::fromCallable() або ReflectionMethod::getClosure(), було видалено.

  • Можливість відв'язати це від належних замикань, що містять використання цього, також була видалена.

  • Можливість використанняarray_key_exists()з об'єктами було видалено. Натомість можна використовуватиisset() або property_exists()

  • Робота параметраkey у функції array_key_exists()тепер наведена відповідно доisset()та звичайним доступом до масиву. Всі типи ключів тепер використовують звичайне приведення типів, масив/об'єкт до ключа призведе до викиданняTypeError

  • Будь-який масив, у якого в якості першого числового ключа вказано число n, використовуватиме n+1 для наступного наступного неявного ключа, навіть якщо n негативно.

  • Рівень error_reporting за замовчуванням тепер**E_ALL. Раніше він виключавE_NOTICE** і **E_DEPRECATED**

  • display_startup_errorsтепер включено за замовчуванням.

  • Використання parent всередині класу, який не має батька, тепер призведе до фатальної помилки під час компіляції.

  • Оператор@більше не пригнічує фатальних помилок (E_ERROR E_CORE_ERROR E_COMPILE_ERROR E_USER_ERROR E_RECOVERABLE_ERROR E_PARSE). Обробники помилок, які очікують, що error_reporting матиме значення при використанні оператора@, повинні робити такі перевірки через бітову маску:

    Loading...

    Крім цього, обов'язково слід приховати відображення повідомлень про помилки у виробничому середовищі, які можуть призвести до витоку інформації. Перевірте, щоdisplay_errors=Offвикористовується разом із записом журналу помилок.

  • #[більше не інтерпретується як початок коментаря, оскільки цей синтаксис тепер використовується для атрибутів.

  • Помилки успадкування через несумісні сигнатури методів (порушення LSP) тепер завжди викликають фатальну помилку. Раніше у деяких випадках видавалося попередження.

  • Пріоритет оператора конкатенації змінився щодо зрушень бітів і додавання, а також віднімання.

    Loading...
  • Аргументи зі значенням за замовчуванням, яке дозволяється в**nullпід час виконання, більше не будуть явно позначати тип аргументу як nullable. Натомість потрібно вказувати або явний тип, що дозволяє значення null, або явне значенняnull**по умолчанию.

    Loading...
  • Ряд попереджень перетворено на виняткиError :

    • Спроба запису як неіснуючого об'єкта. Раніше це неявно створювало об'єкт stdClass у разі null, false та порожніх рядків.
    • Спроба додати елемент до масиву, для якого вже використовується ключ PHP_INT_MAX.
    • Спроба використовувати неприпустимий тип (масив або об'єкт) як ключ масиву або зміщення рядка.
    • Спроба записати в індекс масиву скалярне значення.
    • Спроба розпакувати значення, яке не є масивом/Traversable.
    • Спроба отримати доступ до некваліфікованих константів, які не визначені. Раніше некваліфікований доступ до константів призводив до попередження та інтерпретувався як рядок.
    • Передача невірної кількості аргументів у неваріативну вбудовану функцію призведе до помилкиArgumentCountError

    Ряд повідомлень перетворено на попередження:

    • Спроба прочитати невизначену змінну.
    • Спроба прочитати невизначену властивість.
    • Спроба прочитати невизначений ключ масиву.
    • Спроба прочитати властивість необ'єкта.
    • Спроба отримати доступ до індексу масиву немасиву.
    • Спроба перетворити масив на рядок.
    • Спроба використовувати ресурс як ключ масиву.
    • Спроба використовувати null, логічне значення або число з плаваючою точкою як рядковий зсув.
    • Спроба прочитати усунення рядка за межами допустимого кордону.
    • Спроба присвоїти зміщення рядка порожній рядок.
  • При спробі призначити кілька байтів усунення рядка тепер буде видано попередження.

  • Несподівані символи у вихідних файлах (наприклад, байти NUL за межами рядків) тепер призводять до виключенняParseErrorзамість попередження під час компіляції.

  • Неперехоплені винятки тепер проходять процедуру "чистого завершення", це означає, що після неперехопленого виключення викликатимуться деструктори.

  • Фатальна помилка часу компіляції "Only variables can be passed by reference" була відкладена до часу виконання та перетворена на виключення Error "Argument cannot be passed by reference".

  • Деякі повідомлення "Only variables can be passed by reference" були перетворені на виключення "Argument cannot be passed by reference".

  • Згенероване ім'я для анонімних класів змінилося. Тепер він буде включати ім'я першого з батьків або інтерфейсу:

    Loading...

    За новими іменами, як і раніше, слідуватиме NUL-байт і унікальний суфікс.

  • Посилання на неабсолютні трейти методів в адаптаціях псевдонімів трейтів мають бути однозначними:

    Loading...

    Якщо існують іT1::func(), иT2::func(), цей код раніше приймався без повідомлення, і передбачалося, що func посилається наT1::func. Тепер натомість буде викинуто фатальну помилку: необхідно явно вказатиT1::funcилиT2::func

  • Сигнатура абстрактних методів, визначених у трейтах, тепер перевіряється за методом класу, що реалізує:

    Loading...
  • Відключені функції тепер обробляються так само, як неіснуючі функції. Виклик вимкненої функції повідомить, що немає такої функції, це дає можливість перевизначити вимкнену функцію.

  • Оболонки потокуdata://більше не доступні для запису, що відповідає документованій поведінці.

  • Арифметичні та побітові оператори+ - * ** % << >> & ^ ~ ++ --тепер будуть послідовно видаватиTypeError, коли одним з операндів є масив (array), ресурс (resource) чи не перевантажений об'єкт (object). Єдиним винятком із цього правила є операція злиття масивів+ яка, як і раніше, підтримується.

  • Приведення з плаваючою точкою в рядок тепер завжди поводитиметься незалежно від локалі.

    Loading...

    Смотритеprintf() number_format()и**NumberFormatter()**для отримання інформації про способи настроювання форматування чисел.

  • Видалено підтримку застарілих фігурних дужок для доступу до зміщення.

    Loading...
  • Застосування модифікатора final до закритого методу тепер спричинить попередження, якщо цей метод не є конструктором.

  • Якщо у конструкторі об'єкта використовуєтьсяexit(), Деструктор об'єкта більше не буде викликатися. Це відповідає поведінці, коли конструктор викидає виняток.

  • Імена у просторі імен більше не можуть містити прогалини:Foo\Barбуде розпізнаватись як ім'я в просторі імен,Foo \ Bar- Ні. І навпаки, зарезервовані ключові слова тепер дозволені як сегменти простору імен, що також може змінити інтерпретацію коду:new\xтепер збігається зconstant('new\x'), але не з new \x()

  • Для вкладених тернарних операторів тепер потрібна явна вказівка ​​дужок.

  • debug_backtrace() і Exception::getTrace()більше не надаватимуть посилання на аргументи. Неможливо змінити аргументи функції через трасування.

  • Обробка числових рядків була змінена, щоб зробити її більш зрозумілою і менш схильною до помилок. Завершальні прогалини тепер дозволено у числових рядках для узгодженості з тим, як обробляються початкові прогалини. В основному це впливає на:

    • Функциюis_numeric()
    • Порівняння рядків з рядками
    • Оголошення типів
    • Операції збільшення та зменшення

    Поняття "провідний числовий рядок" в основному було відкинуто; випадки, коли це залишилося, є для полегшення міграції. Рядки, які видавали E_NOTICE "A non well-formed numeric value encountered", тепер видаватимуть E_WARNING "A non-numeric value encountered", а всі рядки, які видавали E_WARNING "A non-numeric value encountered" тепер видаватиме TypeError. В основному це впливає на:

    • Арифметичні операції
    • Побітові операції

    Ця зміна**E_WARNINGна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() і 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()
  • DOMNode::compareDocumentPosition()
  • DOMNode::isEqualNode()
  • DOMNode::getFeature()
  • DOMNode::setUserData()
  • DOMNode::getUserData()
  • DOMDocument::renameNode()

Enchant

Exif

read_exif_data() була вилучена; Замість неї слід використовувати exif_read_data()

Фільтрування даних

  • Флаги**FILTER_FLAG_SCHEME_REQUIRED** і **FILTER_FLAG_HOST_REQUIREDдля фільтраFILTER_VALIDATE_URL** были удалены . schemeиhostнеобхідні (і завжди були).

  • Типи**INPUT_REQUEST** і **INPUT_SESSION**дляfilter_input()і їй похідних було видалено. Вони ніколи не були реалізовані, а спроба їх використання завжди викликала попередження.

GD

  • Застарілі функції image2wbmp() були вилучені.

  • Застарілі функції png2wbmp() і jpeg2wbmp() були вилучені.

  • Параметрmodeза замовчуванням для функціїimagecropauto()більше не набуває значення-1. Натомість слід використовувати IMG_CROP_DEFAULT

  • У Windows, php_gd2.dll перейменований на php_gd.dll.

GMP

gmp_random() було видалено. Замість неї слід використовувати gmp_random_range() або gmp_random_bits()

Iconv

Реалізації iconv, які неправильно встановлюють errno у разі виникнення помилок, більше не підтримуються.

IMAP

Функції інтернаціоналізації

  • Застаріла константа**INTL_IDNA_VARIANT_2003**видалено.

  • Застаріла константа**Normalizer::NONE**видалено.

LDAP

MBString

  • Директиваmbstring.func_overloadбуло видалено. Пов'язані константи**MB_OVERLOAD_MAIL** **MB_OVERLOAD_STRING** і **MB_OVERLOAD_REGEX**також було видалено. Зрештою, записи"func_overload"и"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() і mb_strrichr()тепер може бути порожнім.

  • Параметрis_hex, який не використовувався для внутрішніх цілей, був видалений зmb_decode_numericentity()

  • Застаріла поведінка передачі кодування як третій аргумент замість зміщення для функціїmb_strrpos()було видалено; замість цього як четвертий аргумент слід вказати явне зміщення з кодуванням.

  • Псевдоніми кодування символівISO_8859-*були замінені на псевдонімиISO8859-*для кращої сумісності із модулем iconv. Псевдоніми mbregex ISO 8859 з підкресленням (ISO_8859_*иISO8859_*) також були видалені.

  • mb_ereg() і mb_eregi()тепер повертатимуть логічне значення**true**, у разі знайденого збігу. Раніше вони повертали ціле число , якщо аргумент matchesне було передано, абоmax(1, strlen($matches[0])), якщо matchesбув не пустий.

OCI8

  • КлассOCI-Lobперейменований наOCILob, а класOCI-Collection - у OCICollectionдля імені сумісність забезпечується засобами інструкції типу arginfo PHP 8.

  • Деякі функції псевдонімів оголошено застарілим.

  • oci_internal_debug() та її псевдонім ociinternaldebug() були вилучені.

ODBC

  • odbc_connect()більше не використовує з'єднання повторно.

  • Параметр, що не використовуєтьсяflags функції odbc_exec()був видалений.

OpenSSL

  • openssl_seal() і openssl_open()тепер вимагають передачіmethod, оскільки попереднє значення є типовим"RC4"вважається небезпечним.

Регулярні вирази (сумісні з Perl)

При передачі неприпустимих послідовностей, що управляють, вони більше не інтерпретуються як літерали. Така поведінка раніше вимагала модифікатора X, що тепер ігнорується.

Об'єкти даних PHP

  • Режим обробки помилок за умовчанням було змінено з "тихого" (silent) на "виключення" (exceptions). Детальніше дивіться Помилки та обробка помилок

  • Змінилися сигнатури деяких методів PDO:

    • PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)
    • PDOStatement::setFetchMode(int $mode, mixed ...$args)

PDO ODBC

Директива php.inipdo_odbc.db2_instance_name було видалено.

PDO MySQL

PDO::inTransaction() тепер повідомляє фактичний стан транзакції підключення, а не про приблизний від PDO. Якщо запит, за умови "неявної фіксації", виконується, то PDO::inTransaction() згодом поверне false, оскільки транзакція буде неактивною.

PostgreSQL

  • Застарілий синтаксисpg_connect()з використанням кількох параметрів замість рядка підключення більше не підтримується.

  • Застарілі сигнатуриpg_lo_import() і pg_lo_export(), що передають з'єднання як останній аргумент, більше не підтримуються. Натомість з'єднання має бути передано першим аргументом.

  • pg_fetch_all()тепер повертатиме порожній масив замість**false**для наборів результатів із відсутніми рядками.

Phar

Метадані, пов'язані з phar, більше не будуть десеріалізуватися автоматично, щоб виправити потенційні вразливості безпеки через створення екземплярів об'єкта, автозавантаження і т.д.

Reflection

  • Сигнатури методів

    • 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()тепер повертатиме повне налагоджувальне уявлення типу і більше не є застарілим. Зокрема, результат включатиме індикатор допустимості значень NULL для типів, що допускають значення NULL. Формат значення, що повертається, нестабільний і може змінюватися в залежності від версії PHP.

  • Методи Reflection export() були видалені. Натомість об'єкти reflection можуть бути перетворені на рядок.

  • ReflectionMethod::isConstructor() і ReflectionMethod::isDestructor()тепер також повертають**true**для методів інтерфейсів__construct() і __destruct(). Раніше це було правильно тільки для методів класів і трейтів.

  • Метод**ReflectionType::isBuiltin()**переїхав вReflectionNamedType. УReflectionUnionTypeцього методу немає.

Сокети

  • Застаріліflags **AI_IDN_ALLOW_UNASSIGNED** і **AI_IDN_USE_STD3_ASCII_RULES**дляsocket_addrinfo_lookup() були вилучені.

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

Бібліотека стандартних функцій

  • assert()більше не виконуватиме рядкові аргументи, натомість вони будуть оброблятися як будь-які звичайні аргументи. Таким чином, замістьassert('$a == $b')слід використовуватиassert($a == $b). INI-директиваassert.quiet_evalта константа**ASSERT_QUIET_EVAL**були видалені, оскільки вони не мають сенсу.

  • parse_str()більше не можна використовувати без зазначення масиву результатів.

  • Фильтрstring.strip_tagsвидалено.

  • Аргументneedleфункцийstrpos() strrpos() stripos() strripos() strstr() strchr() strrchr() і stristr()тепер завжди інтерпретуватиметься як рядок. Раніше невеликі потреби інтерпретувалися як кодова точка ASCII. Явний викликchr()може використовуватись для відновлення попередньої поведінки.

  • Аргументneedleфункцийstrpos() strrpos() stripos() strripos() strstr() stristr() і strrchr()тепер може бути порожнім.

  • Аргументlengthфункцийsubstr() substr_count() substr_compare() і iconv_substr()тепер може бути**nullЗначенияnull**означає відсутність аргументу довжини, і тому функції повернуть залишок рядка замість порожнього рядка.

  • Аргументlength функції array_splice()тепер може бути**null. Передача значенняnull**означає відсутність аргументу, тому функція видалити все, починаючи відoffsetдо кінця масиву.

  • Аргументargsфункцийvsprintf() vfprintf() і vprintf()тепер має бути масивом. Раніше приймався будь-який тип.

  • Параметр'salt' функції password_hash()більше не підтримується. Якщо використовується опція'salt', генерується попередження, передана сіль ігнорується, а замість неї використовується сгенерована сіль.

  • Функцияquotemeta()тепер повертатиме порожній рядок, якщо було передано порожній рядок. Раніше поверталося**false**

  • Видалено такі функції:

  • **FILTER_SANITIZE_MAGIC_QUOTES**видалено.

  • Виклик implode()з параметрами у зворотному порядку($pieces, $glue)більше не підтримується.

  • parse_url()тепер буде розрізняти відсутні та порожні запити та фрагменти:

    • 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() і debug_zval_dump()тепер друкуватимуть числа з плаваючою точкою, використовуючиserialize_precision, а неprecision. У конфігурації за промовчанням це означає, що цифри з плаваючою точкою тепер друкуються з повною точністю цими функціями налагодження.

  • Якщо масив, що повертається__sleep(), Містить неіснуючі властивості, тепер вони автоматично проігноруються. Раніше такі властивості були б серіалізовані, якби вони мали значення**null**

  • Локаль за замовчуванням під час запуску тепер завжди буде визначено як"C". За замовчуванням локалі не успадковуються з оточення. Раніше для**LC_ALLбуло встановлено значення"C", в той час якLC_CTYPE**успадковувався від оточення. Однак деякі функції не враховували успадковану локаль без явного викликуsetlocale(). Явний викликsetlocale()тепер потрібно завжди, якщо компонент локалі повинен бути змінений зі значенням за замовчуванням.

  • Застарілий резервний варіант DES вcrypt()був видалений. Якщо вcrypt()передається невідомий формат солі, функція завершиться помилкою з*0замість повернення до слабкого хешу DES.

  • При вказанні значень поза допустимим діапазоном для SHA256/SHA512crypt()тепер буде видана помилка*0замість обмеження до найближчої межі. Це відповідає поведінці glibc.

  • Результат функцій сортування міг змінитися, якщо масиві є однакові елементи.

  • Будь-які функції, що приймають callback-функції, які явно не вказані для прийому параметрів посилання, тепер будуть попереджати, якщо використовується callback-функція з посиланнями. Наприклад,array_filter() і array_reduce(). Раніше так було більшість функцій, але не всі.

  • Обгортка HTTP-потоку, використовувана такими функціями, якfile_get_contents(), тепер за промовчанням оголошує HTTP/1.1, а не HTTP/1.0. Не змінює поведінки клієнта, але може змусити сервери реагувати інакше. Щоб зберегти стару поведінку, установіть параметр контексту потоку'protocol_version', наПриклад:

    Loading...
  • Виклик crypt()без явної передачі солі більше не підтримується. Якщо ви хочете створити надійний хеш із автоматично згенерованою сіллю, використовуйте натомістьpassword_hash()

  • substr() mb_substr() iconv_substr() і grapheme_substr()тепер послідовно фіксують зміщення межі кордону рядка. Раніше, у деяких випадках, замість порожнього рядка повертався**false**

  • У Windows функції виконання програм (proc_open() exec() popen()і т.д.) з використанням оболонки тепер послідовно виконують**%comspec% /s /c "$commandline"яка робить те ж саме, що і виконання$commandline**(без додаткових лапок).

Sysvsem

  • Параметрauto_releaseвsem_get()був змінений, щоб набувати логічних значень (bool), а не цілі числа (int).

Tidy

PHP-лексер (Tokenizer)

  • У лексемах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

XMLReader::open() і XMLReader::xml() тепер є статичними методами. Їх, як і раніше, можна викликати як методи екземпляра, але наступні класи повинні оголошувати їх як статичні, якщо вони перевизначають ці методи.

XML-RPC

Модуль XML-RPC був переміщений до PECL і не є частиною дистрибутива PHP.

Zip

ZipArchive::OPSYS_Z_CPM була видалена (у цьому імені була помилка). Використовуйте замість неї ZipArchive::OPSYS_CPM

Zlib

Пакети тестів PHP для Windows

Скрипт виконання тестів був перейменований з run-test.php на run-tests.php, щоб відповідати його імені в php-src.