Некомпатибилни промени воназад
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Некомпатибилни промени воназад
Референца за `migration81.incompatible.php` со подобрена типографија и навигација.
Некомпатибилни промени воназад
PHP јадро
$GLOBALS Access Restrictions
Пристапот до $GLOBALS низот сега е предмет на голем број ограничувања. Читањето и запишувањето пристап до индивидуални елементи на низот како
$GLOBALS['var'] продолжува да работи како што е. Читањето пристап до целиот $GLOBALS низ исто така продолжува да биде поддржано. Сепак, запишувањето пристап до целиот $GLOBALS низ веќе не е поддржано. На пример, array_pop($GLOBALS)
ќе резултира со грешка.
Употребата на static Променливи во наследени методи
Кога метод што користи статички променливи е наследен (но не е препишан), наследениот метод сега ќе споделува статички променливи со родителскиот метод.
<?php
class A {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), previously int(1)
var_dump(B::counter()); // int(4), previously int(2)
?>Опционални параметри специфицирани пред задолжителни параметри
Еден опционален параметар специфициран пред задолжителни параметри сега секогаш се третира како задолжителен, дури и кога се повикува користејќи именувани аргументи. Од PHP 8.0.0, но пред PHP 8.1.0, подолу е испуштено известување за депрекација при дефиницијата, но работи успешно кога се повикува. Од PHP 8.1.0, грешка од класа ArgumentCountError се фрла, како што би било кога се повикува со позициони аргументи.
<?php
function makeyogurt($container = "bowl", $flavour)
{
return "Making a $container of $flavour yogurt.\n";
}
try
{
echo makeyogurt(flavour: "raspberry");
}
catch (Error $e)
{
echo get_class($e), ' - ', $e->getMessage(), "\n";
}
?>Излез од горниот пример во PHP 8.0:
Deprecated: Required parameter $flavour follows optional parameter $container in example.php on line 3 Making a bowl of raspberry yogurt.
Излез од горниот пример во PHP 8.1:
Deprecated: Optional parameter $container declared before required parameter $flavour is implicitly treated as a required parameter in example.php on line 3 ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed
Имајте предвид дека вредноста по дифолт од null може да се користи пред задолжителните параметри за да се специфицира nullable тип, но параметарот ќе остане задолжителен.
Компатибилност на типот на враќање со внатрешни класи
Повеќето внатрешни методи што не се конечни сега бараат методи за преоптоварување да декларираат компатибилен тип на враќање, инаку се емитува известување за застареност за време на валидацијата на наследувањето. Во случај типот на враќање да не може да се декларира за метод за преоптоварување поради проблеми со компатибилноста помеѓу верзиите на PHP, а ReturnTypeWillChange Ако типот на враќање не може да се декларира за надредена метода поради проблеми со компатибилноста на PHP верзиите, може да се додаде
Нови клучни зборови
readonly е клучниот збор сега. Сепак, сè уште може да се користи како име на функција.
never сега е резервиран збор, така што не може да се користи за именување на класа, интерфејс или трејт, а исто така е забрането да се користи во имиња на простори.
Миграција на ресурси во објекти
Неколку resourceи се мигрирани во object. Проверките на вратената вредност користејќи is_resource() треба да се заменат со проверки за false.
-
На FileInfo , освен ако не е поинаку наведено. finfo објекти наместо
fileinforesources. -
На FTP , освен ако не е поинаку наведено. FTP\Connection објекти наместо
ftpresources. -
На IMAP , освен ако не е поинаку наведено. IMAP\Connection објекти наместо
imapresources. -
На LDAP , освен ако не е поинаку наведено. LDAP\Connection објекти наместо
ldap linkresources. -
На LDAP , освен ако не е поинаку наведено. LDAP\Result објекти наместо
ldap resultresources. -
На LDAP , освен ако не е поинаку наведено. LDAP\ResultEntry објекти наместо
ldap result entryresources. -
На PgSQL , освен ако не е поинаку наведено. PgSql\Connection објекти наместо
pgsql linkresources. -
На PgSQL , освен ако не е поинаку наведено. PgSql\Result објекти наместо
pgsql resultresources. -
На PgSQL , освен ако не е поинаку наведено. PgSql\Lob објекти наместо
pgsql large objectresources. -
На PSpell , освен ако не е поинаку наведено. PSpell\Dictionary објекти наместо
pspellresources. -
На PSpell , освен ако не е поинаку наведено. PSpell\Config објекти наместо
pspell configresources.
MySQLi
mysqli_fetch_fields()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
mysqli_fetch_field_direct() will now always return
0 » PEAR max_lengthсега секогаш ќе враќа
На MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
. Оваа информација може да се пресмета со итерација низ множеството на резултати и земање на максималната должина. Ова е она што PHP го правеше внатрешно претходно.
На MYSQLI_STORE_RESULT_COPY_DATA
опцијата веќе нема никакво влијание.
mode параметарот
функцијата е најчеста и комбинира извршна изјава со баферирано преземање на нејзиниот сет на резултати, ако постои, во еден повик. Повикување опцијата веќе нема никакво влијание. Поминувањето на каква било вредност на
веќе нема никакво влијание. сега враќа true наместо null на успешен исход.
mysqli::connect() Режимот за ракување со грешки по дифолт е променет од „тивок“ на „исклучоци“. Погледнете го
MySQLi режим на известување
mysqli_report(MYSQLI_REPORT_OFF);
страницата за повеќе детали за тоа што подразбира ова и како експлицитно да го поставите овој атрибут. За да го вратите претходното однесување користете: mysqli_stmt::bind_param() Класите што наследуваат од
MySQLnd
На mysqlnd.fetch_data_copy сега се обврзани да ја наведат дополнителната опционална параметар.
OpenSSL
INI директивата е отстранета. Ова не треба да резултира со промени во однесувањето видливи за корисникот. PKCSEC приватните клучеви сега ќе бидат извезени во
openssl_pkcs7_encrypt() and openssl_cms_encrypt() формат #8 наместо традиционалниот формат, исто како и сите други клучеви.
PHP Објекти за податоци
PDO::ATTR_STRINGIFY_FETCHES сега ќе користи AES-128-CBC наместо RC2-40 по дифолт. RC2-40 шифрата се смета за несигурна и не е овозможена по дифолт од OpenSSL 3. bool to "0" or
"1"вредностите не можат да се претворат во boolсега ги претвора вредностите од типот
Повикување и ги доделува вредностите на колоните во вашето множество резултати на PHP променливите на кои биле поврзани со with
PDO::PARAM_LOB не беа претворени во стринг. PDO::ATTR_STRINGIFY_FETCHES сега постојано ќе врзува стрим резултат кога
не е овозможено. Претходно, резултатот ќе биде стрим или стринг во зависност од користениот драјвер за базата на податоци и времето кога се врши врзувањето.
Цели броеви и децимални броеви во множествата со резултати сега ќе се враќаат користејќи ги нативните PHP типови наместо strings кога се користат емулирани подготвени изрази. Ова го одразува однесувањето на нативните подготвени изрази. Претходното однесување може да се врати со овозможување на
PDO::ATTR_STRINGIFY_FETCHES option.
SQLite драјвер
Цели броеви и децимални броеви во множествата со резултати сега ќе се враќаат користејќи ги нативните PHP типови. Претходното однесување може да се врати со овозможување на
PDO::ATTR_STRINGIFY_FETCHES option.
Phar
За да се усогласи со ArrayAccess интерфејс, Phar::offsetUnset() and PharData::offsetUnset() повеќе не враќаат bool.
Стандардно
version_compare() повеќе не прифаќа недокументирани кратенки на оператори.
htmlspecialchars(),
htmlentities(),
htmlspecialchars_decode(),
html_entity_decode()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во get_html_translation_table()
сега користат ENT_QUOTES | ENT_SUBSTITUTE отколку
ENT_COMPAT по дифолт. Ова значи дека ' се избегнува во
' додека претходно ништо не се правеше. Дополнително, неправилно формиран UTF-8 ќе биде заменет со уникод-симбол за замена, наместо да резултира со празен стринг.
debug_zval_dump() сега го печати рефбројот на обвивките на референцата со нивниот рефброј, наместо само да го претходи
& на вредноста. Ова попрецизно ја моделира репрезентацијата на референцата од PHP 7.0.
debug_zval_dump() сега печати interned
наместо лажен рефброј за интерни стрингови и непроменливи низи.
Стандардна PHP библиотека (SPL)
SplFixedArray, сега ќе бидат JSON кодирани како array