Зміни, що ламають зворотну сумісність
Ядро PHP
Порівняння рядків з числами
Нестрогі порівняння чисел і нечислових рядків тепер працюють, як перетворення числа на рядок з наступним порівнянням рядків. Порівняння чисел та числових рядків працює, як і раніше. Зокрема, це означає, що 0 == "not-a-number"
Тепер видасть false.
Сравнение | До | После |
---|---|---|
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
тепер зарезервоване слово, тому його не можна використовувати для назви класу, інтерфейсу чи риси, а також заборонено використовувати у просторах імен. -
Помилки тверджень (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
-
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() і enchant_broker_request_pwl_dict()тепер повертаютьEnchantDictionaryоб'єкт замість ресурсу (resource
-
Модуль GD тепер використовує об'єктиGdImageяк базова структура даних для зображень, а не ресурси (resource). Функціяimagedestroy()більше немає сенсу; натомість екземплярGdImageавтоматично знищується, якщо на нього немає посилання.
-
openssl_x509_read() і 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()тепер повертає об'єктShmopзамість ресурсу (resource). Функціяshmop_close()більше немає сенсу і оголошена застарілою; натомість екземплярShmopавтоматично знищується, якщо на нього більше не посилаються.
-
socket_create() socket_create_listen() socket_accept() socket_import_stream() socket_addrinfo_connect() socket_addrinfo_bind() і socket_wsaprotocol_info_import()тепер повертають об'єктSocketзамість ресурсу (resource) . socket_addrinfo_lookup()тепер повертає масив об'єктівAddressInfoзамість масиву ресурсів (resource
-
msg_get_queue()тепер повертають об'єктSysvMessageQueueзамість ресурсу (resource
-
sem_get()тепер повертають об'єктSysvSemaphoreзамість ресурсу (resource
-
shm_attach()тепер повертають об'єктSysvSharedMemoryзамість ресурсу (resource
-
xml_parser_create() і xml_parser_create_ns()тепер повертають об'єктXMLParserзамість ресурсу (resource). Функціяxml_parser_free()більше не має сенсу, натомість екземпляр XMLParser автоматично знищується, якщо на нього більше не посилаються.
-
Функції XMLWriterтепер приймають та повертають, відповідно, об'єктиXMLWriterзамість ресурсів (resource
-
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() і 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
- enchant_broker_list_dicts() enchant_broker_describe() і enchant_dict_suggest()тепер повертають порожній масив замість**
null
**
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
-
Невикористовуваний аргумент
default_host
функції imap_headerinfo()був видалений. -
Функцияimap_header()яка є псевдонімомimap_headerinfo(), було видалено.
Функції інтернаціоналізації
-
Застаріла константа**
INTL_IDNA_VARIANT_2003
**видалено. -
Застаріла константа**
Normalizer::NONE
**видалено.
LDAP
-
Застарілі функції ldap_sort() ldap_control_paged_result() і ldap_control_paged_result_response()видалено.
-
Змінився інтерфейсldap_set_rebind_proc(); параметр
callback
більше не приймає порожні рядки; натомість слід вказувати**null
**
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. У наступному списку вказано, які функції слід використовувати замість них:
- 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() і 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)
-
SplFileObject::fgetss()був видалений.
-
SplFileObject::seek()тепер завжди переміщається початку рядка. Раніше, позиція
>=1
переміщала на початок наступні рядки. -
SplHeap::compare()тепер вказує сигнатуру методу. Наслідуючі класи, які реалізують цей метод, тепер повинні використовувати сумісну сигнатуру методу.
-
SplDoublyLinkedList::push() SplDoublyLinkedList::unshift() і SplQueue::enqueue()тепер повертають void замість**
true
** -
spl_autoload_register()тепер завжди викидатимеTypeErrorдля неприпустимих аргументів, тому другий аргумент
do_throw
ігнорується, якщо для нього встановлено значення**false
** -
SplFixedArrayтепер єIteratorAggregate, а неIterator. . SplFixedArray::rewind() SplFixedArray::current() SplFixedArray::key() SplFixedArray::next() і SplFixedArray::valid()були вилучені. Замість них було доданоSplFixedArray::getIterator(). Будь-який код, який використовує явну ітерацію над SplFixedArray, тепер має отриматиIterator за допомогою SplFixedArray::getIterator(). Це означає, що SplFixedArrayтепер безпечно використовувати у вкладених циклах.
Бібліотека стандартних функцій
-
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
-
Параметр
use_include_path
, який не використовувався внутрішньо, був видалений зtidy_repair_string() -
tidy::repairString() і tidy::repairFile()стали статичними методами
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
-
gzgetss()видалено.
-
zlib.output_compressionбільше не вимикається автоматично для
Content-Type: image/*
Пакети тестів PHP для Windows
Скрипт виконання тестів був перейменований з run-test.php на run-tests.php, щоб відповідати його імені в php-src.