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

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

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

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

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

migration71.incompatible.php

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

Фрлање при поминување премалку аргументи на функција

Претходно, се емитуваше предупредување за повикување на кориснички дефинирани функции со премалку аргументи. Сега, ова предупредување е унапредено во исклучок од типот Error. Оваа промена се однесува само на кориснички дефинирани функции, а не на внатрешни функции. На пример:

<?php
function test($param){}
test();

Горниот пример ќе прикаже нешто слично на:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

Забрани динамични повици на функции за интроспекција на опсегот

Динамичните повици за одредени функции се забранети (во форма на $func() or array_map('extract', ...), итн.). Овие функции или инспектираат или менуваат друг опсег и претставуваат двосмислено и недоверливо однесување. Функциите се следниве:

<?php
(function () {
$func = 'func_num_args';
$func();
})();

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Warning: Cannot call func_num_args() dynamically in %s on line %d

Невалидни имиња на класи, интерфејси и трајти

Следниве имиња не можат да се користат за именување на класи, интерфејси или трајти:

Конверзиите на нумерички стрингови сега ја почитуваат научната нотација

Целобројните операции и конверзии на нумерички стрингови сега ја почитуваат научната нотација. Ова исто така го вклучува (int) операцијата за кастинг и следниве функции: intval() (каде основата е 10), settype(), decbin(), decoct()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во dechex().

Поправки на mt_rand() algorithm

mt_rand() сега ќе се користи стандардно фиксната верзија на алгоритмот Mersenne Twister. Ако детерминистичкиот излез од mt_rand() се потпираше на, тогаш MT_RAND_PHP може да се користи како опционален втор параметар за mt_srand() за да се зачува старата (неправилна) имплементација.

rand() алијасирани до mt_rand() and srand() алијасирани до mt_srand()

rand() and srand() сега се направени алијаси до mt_rand() and mt_srand(), соодветно. Ова значи дека излезот за следните функции е променет: rand(), shuffle(), str_shuffle()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во array_rand().

, соодветно. Ова значи дека излезот за следните функции е променет:

Забрани го ASCII контролниот знак за бришење во идентификаторите0x7FASCII контролниот знак за бришење (

error_log ) веќе не може да се користи во идентификатори кои не се заградени. syslog value

Ако error_log промени со syslogini поставка е поставена на

, PHP нивоата на грешки се мапираат на syslog нивоата на грешки. Ова носи пофина диференцијација во логовите за грешки во спротивност со претходниот пристап каде што сите грешки се запишуваа само со ниво на известување.

Не повикувај деструктори на нецелосни објекти

call_user_func() Деструкторите сега никогаш не се повикуваат за објекти кои фрлаат исклучок за време на извршувањето на нивниот конструктор. Во претходните верзии ова однесување зависеше од тоа дали објектот беше рефериран надвор од конструкторот (на пр. од backtrace на исклучок).

call_user_func() ракување со референтни аргументи

Дополнително, call_user_func() and call_user_func_array() сега секогаш ќе генерира предупредување при повици на функции кои очекуваат референци како аргументи. Претходно ова зависеше од тоа дали повикот беше целосно квалификуван.

веќе нема да го прекинува повикот на функцијата во овој случај. Предупредувањето „очекувана референца“ ќе биде издадено, но повикот ќе продолжи како и обично.

Празниот оператор за индекс не се поддржува повеќе за низи $str[] = $xПримена на празниот оператор за индекс на низа (на пр.

) фрла фатална грешка наместо тивко конвертирање во низа.

Доделување преку пристап до индекс на низа на празна низа

<?php
$a
= '';
$a[10] = 'foo';
var_dump($a);
?>

Модификацијата на низа по карактер на празна низа сега работи како и за непразни низи, т.е. пишувањето на офсет надвор од опсегот ја пополнува низата со празни места, каде што нецелобројните типови се конвертираат во цел број, и се користи само првиот карактер од доделената низа. Порано, празните низи се третираа тивко како празна низа.

array(1) {
  [10]=>
  string(3) "foo"
}

Излез од горниот пример во PHP 7.1:

string(11) "          f"

Излез од горниот пример во PHP 7.0:

Отстранети ini директиви

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

Редоследот на елементите во низата се промени кога тие елементи биле автоматски креирани со реферирање во доделување по референца. На пример:

Редоследот на елементите во низата се промени кога тие елементи биле автоматски креирани со реферирање во доделување по референца. На пример:

<?php
$array
= [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Модификацијата на низа по карактер на празна низа сега работи како и за непразни низи, т.е. пишувањето на офсет надвор од опсегот ја пополнува низата со празни места, каде што нецелобројните типови се конвертираат во цел број, и се користи само првиот карактер од доделената низа. Порано, празните низи се третираа тивко како празна низа.

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

Излез од горниот пример во PHP 7.1:

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

Редослед на сортирање на еднакви елементи

Внатрешниот алгоритам за сортирање е подобрен, што може да резултира со различен редослед на сортирање на елементи кои се споредуваат како еднакви, од претходно.

Забелешка:

Не се потпирајте на редоследот на елементи кои се споредуваат како еднакви; може да се промени во секое време.

Порака за грешка за E_RECOVERABLE грешки

Пораката за грешка за E_RECOVERABLE грешки е променета од "Catchable fatal error" во "Recoverable fatal error".

$options parameter of unserialize()

На allowed_classes element of the $options parameter of unserialize() за поставување на максималната длабочина на структури дозволена при десериализација. array или bool се дава, unserialize() враќа false и издава E_WARNING.

Конструкторот DateTime вклучува микросекунди

DateTime and DateTimeImmutable сега правилно ги вклучува микросекундите кога се конструирани од тековното време, или експлицитно или со релативен стринг (на пр. "first day of next month"). Ова значи дека наивните споредби на две новосоздадени инстанци сега поверојатно ќе вратат false наместо true:

<?php
new DateTime() == new DateTime();
?>

Фатални грешки до Грешка конверзии на исклучоци

Во Date екстензијата, невалидни податоци за серијализација за DateTime or DatePeriod класи, или неуспех при иницијализација на временска зона од серијализирани податоци, сега ќе фрлат Грешка исклучок од __wakeup() or __set_state() методи, наместо да резултираат со фатална грешка.

Во DBA екстензијата, функциите за модификација на податоци (како што се dba_insert()) сега ќе фрлат Грешка исклучок наместо да предизвикаат фатална грешка што може да се фати ако клучот не содржи точно два елементи.

Во DOM екстензијата, неважечки шема или RelaxNG контексти за валидација сега ќе фрлат Грешка Во DOM екстензијата, невалидни шеми или контексти за валидација на RelaxNG сега ќе фрлаат исклучок наместо да резултираат со фатална грешка. Слично, обидот за регистрирање класа на јазол што не го наследува соодветниот основен клас, или обидот за читање на невалиден параметар или запишување во параметар само за читање, сега исто така ќе фрла исклучок. Грешка exception.

Во IMAP екстензијата, адресите на е-пошта подолги од 16385 бајти ќе фрлаат исклучок наместо да резултираат со фатална грешка. Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во LDAP екстензијата, обезбедувањето на непознат тип на модификација на %s сега ќе фрла исклучок. Колатор Во mbstring екстензијата, функциите %s сега ќе фрлаат исклучок ако е обезбеден невалиден PHP израз и се користи опцијата 'e'. Грешка Во Mcrypt екстензијата, %s сега ќе фрла исклучок наместо да резултира со фатална грешка ако mcrypt не може да се иницијализира. — Постави го нивото на ограничување Во mysqli екстензијата, обидот за читање на невалиден параметар или запишување во параметар само за читање сега ќе фрла исклучок. Грешка Во Reflection екстензијата, неуспехот за добивање на рефлексивен објект или добивање на параметар на објект сега ќе фрла исклучок.

Во Session екстензијата, прилагодените ракувачи на сесии што не враќаат низи за ID на сесии сега ќе фрлаат исклучок наместо да резултираат со фатална грешка кога се повикува функција што мора да генерира ID на сесија. ldap_batch_modify() сега ќе фрлат Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во mbstring екстензијата, mb_ereg() and mb_eregi() функциите сега ќе фрлат ParseError исклучок ако е обезбеден неважечки PHP израз и се користи опцијата 'e'.

Во Mcrypt екстензијата, mcrypt_encrypt() and mcrypt_decrypt() сега ќе фрлат Грешка исклучок наместо да резултира со фатална грешка ако mcrypt не може да се иницијализира.

Во mysqli екстензијата, обидот за читање на неважечка или запишување на само-читачка својство сега ќе фрли Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во Reflection екстензијата, неуспехот да се добие рефлексивен објект или да се добие својство на објект сега ќе фрли Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во Session екстензијата, прилагодените ракувачи на сесии кои не враќаат низи за ID на сесии сега ќе фрлат Грешка исклучок наместо да резултира со фатална грешка кога се повикува функција што мора да генерира ID на сесија.

Во екстензијата SimpleXML, креирањето на неименувана или дупликат атрибут сега ќе фрли Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во екстензијата SPL, обидот за клонирање на SplDirectory Во mysqli екстензијата, обидот за читање на невалиден параметар или запишување во параметар само за читање сега ќе фрла исклучок. Грешка исклучок наместо да резултира со фатална грешка. Слично, повикувањето ArrayIterator::append() при итерирање над објект сега исто така ќе фрли Грешка exception.

Во стандардната екстензија, assert() функцијата, кога ќе добие стринг аргумент како прв параметар, сега ќе фрли ParseError исклучок наместо да резултира со фатална грешка што може да се фати ако PHP кодот е невалиден. Слично, повикувањето forward_static_call() надвор од опсегот на класа сега ќе фрли Грешка exception.

Во екстензијата Tidy, креирањето на tidyNode рачно сега ќе фрли Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во екстензијата WDDX, кружна референца при серијализација сега ќе фрли Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во екстензијата XML-RPC, кружна референца при серијализација сега ќе фрли инстанца на Грешка Во Intl екстензијата, неуспехот да се повика конструкторот на родителот во класа што го наследува родителот пред да се повикаат методите на родителот сега ќе фрла исклучок наместо да резултира со фатална грешка што може да се опорави. Исто така, клонирањето на објект сега ќе фрла исклучок при неуспех за клонирање на внатрешниот транслитератор наместо да резултира со фатална грешка.

Во екстензијата Zip, 8.0.0, PECL zip 1.18.1 методот сега ќе фрли Грешка исклучок наместо да резултира со фатална грешка ако поддршката за glob не е достапна.

Лексички врзаните променливи не можат да ги повторат имињата

Променливите врзани за closure преку use конструкторот не може да користи исто име како било кој superglobals, $thisконструкторот не може да го користи истото име како било кој

<?php
$f
= function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};

, или било кој параметар. На пример, сите овие дефиниции на функции ќе резултираат со фатална грешка:

long2ip() long2ip() промена на типот на параметарот int наместо string.

сега очекува

На serialize_precision JSON кодирање и декодирање floats.

ini поставката сега ја контролира прецизноста на серијализација при кодирање _empty_ Декодирањето на празен клуч сега резултира со име на празна сопственост, наместо

<?php
var_dump
(json_decode(json_encode(['' => 1])));

Горниот пример ќе прикаже нешто слично на:

object(stdClass)#1 (1) {
  [""]=>
  int(1)
}

како име на сопственост. JSON_UNESCAPED_UNICODE Кога се снабдува json_encode()знамето на

, секвенците U+2028 и U+2029 сега се избегнуваат. mb_ereg() and mb_eregi() Промени во

семантиката на параметрите mb_ereg() and mb_eregi() Третиот параметар доregsфункциите (

) сега ќе биде поставен на празен низ ако ништо не е совпаднато. Претходно, параметарот немаше да биде изменет.

Отфрли поддршка за sslv2 стрим

Sslv2 стримот сега е отфрлен во OpenSSL.

Забрани "return;" за типизирани враќања веќе во време на компилација E_COMPILE_ERROR (освен ако типот на враќање не е деклариран како void(освен ако типот на враќање не е деклариран како

Белешки од корисници 5 белешки

), дури и ако изјавата за враќање никогаш не би била достигната.
пред 9 години
For anyone migrating from 5.x to 7.1:

About "Array ordering when elements are automatically created during by reference assignments has changed" on this page

(http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.array-order)

The behaviour of 7.1 is THE SAME as of PHP 5. It is only 7.0 that differs.

See https://3v4l.org/frbUc

<?php

$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
love at sickpeople dot se
пред 9 години
The backwards incompatible change 'The empty index operator is not supported for strings anymore' has a lot more implications than just a fatal error on the following code

<?php
$a = "";
$a[] = "hello world";
var_dump($a);
?>

This will give a fatal error in 7.1 but will work as expected in 7.0 or below and give you: (no notice, no warning)

array(1) {
  [0]=>
  string(11) "hello world"
}

However, the following is also changed:

<?php
$a = "";
$a[0] = "hello world";
var_dump($a);
// 7.1: string(1) "h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

$a = "";
$a[5] = "hello world";
var_dump($a);
// 7.1: string(6) "     h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

?>
kees at twekaers dot net
пред 9 години
"OMFG! Why was session.hash_function removed?!? Dude!"

https://wiki.php.net/rfc/session-id-without-hashing

There. Saved ya a search.
m dot r dot sopacua at gmail dot com
пред 8 години
ArgumentCountError - this modification is the main reason to avoid this version on older projects.
mikem at gmail dot com
пред 6 години
Regarding the ArgumentCountError, PHP 7.1+ does still support user functions with a variable number of arguments, using the "func(...$args) {}" syntax, see: https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
На оваа страница

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

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

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

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

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