PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 460 · Официальная база → практическое применение
Миграции PHP 5.6–7.2: от старого проекта к типизированной базе
Полная карта официальных страниц перехода PHP 5.5 → 5.6, PHP 5.6 → 7.0, PHP 7.0 → 7.1, PHP 7.1 → 7.2, дополненная проверяемым порядком обновления.
PHP 5.5 → 5.6
Этот узел — контрольная карта перехода PHP 5.5 → 5.6. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Изменения, которые ломают обратную совместимость
- Новые возможности
- Функционал, объявленный устаревшим в PHP 5.6.x
- Изменённые функции
- Новые функции
- Изменения OpenSSL в PHP 5.6.x
- Другие изменения в модулях
- Новые глобальные константы
Большинство улучшений в PHP 5.6.x не влияют на существующий код. Требуется учесть несовместимости и новые особенности, и протестировать код перед переключением версий PHP в производственных окружениях.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- Backward incompatible changes
- New features
- Deprecated features in PHP 5.6.x
- Changed functions
- New functions
- OpenSSL changes in PHP 5.6.x
- Other changes to extensions
- New global constants
Most improvements in PHP 5.6.x have no impact on existing code. There are a few incompatibilities and new features that should be considered, and code should be tested before switching PHP versions in production environments.
| Шаг | Что зафиксировать до изменения |
|---|---|
| Среда | PHP, SAPI, расширения, php.ini, ОС и библиотеки. |
| Поведение | Тесты на реальные входы, ошибки, сериализацию и ответы API. |
| Зависимости | composer.lock, системные пакеты и внешние службы. |
| Возврат | Резервная копия, совместимая схема данных и команда отката. |
PHP 5.5 → 5.6: Новые возможности языка и платформы
Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Константные выражения
Теперь можно предоставить скалярное выражение, которое включает числовые и строковые литералы и (или) константы, когда раньше ожидалось статическое значение, например, в объявлениях констант или значениях аргументов функций по умолчанию.
<?php
const ONE = 1;
const TWO = ONE * 2;
class C
{
const THREE = TWO + 1;
const ONE_THIRD = ONE / self::THREE;
const SENTENCE = 'Значение константы THREE - '.self::THREE;
public function f($a = ONE + self::THREE)
{
return $a;
}
}
echo (new C)->f()."\n";
echo C::SENTENCE;
?>Результат выполнения приведённого примера:
4 Значение константы THREE — 3
Массив (array) также определяют через ключевое слово
const:
<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>Результат выполнения приведённого примера:
a
Функции с переменным количеством аргументов через оператор ...
Функции с переменным количеством аргументов
теперь разрешается реализовывать через оператор ..., вместо того
чтобы полагаться на функцию func_get_args().
<?php
function f($req, $opt = null, ...$params)
{
// Переменная $params — массив, который содержит остальные аргументы
printf(
'$req: %d; $opt: %d; количество параметров: %d' . "\n",
$req,
$opt,
count($params)
);
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>Результат выполнения приведённого примера:
$req: 1; $opt: 0; количество параметров: 0 $req: 1; $opt: 2; количество параметров: 0 $req: 1; $opt: 2; количество параметров: 1 $req: 1; $opt: 2; количество параметров: 2 $req: 1; $opt: 2; количество параметров: 3
Распаковка аргументов через оператор ...
Массивы и объекты, которые реализуют
интерфейс Traversable, разрешается распаковывать
в список аргументов при вызове функций и передаче аргументов через оператор ....
В других языках, включая Ruby, оператор знают как splat- или spread-оператор.
<?php
function add($a, $b, $c)
{
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>Результат выполнения приведённого примера:
6
Возведение в степень через оператор **
Добавили правоассоциативный оператор **
возведения в степень, и короткий синтаксис **= присваивания.
<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>Результат выполнения приведённого примера:
2 ** 3 == 8 2 ** 3 ** 2 == 512 a == 8
Конструкции use function и use const
Оператор
use
расширили, чтобы в дополнение к классам
поддержать импорт функций и констант.
Конструкция use function импортирует функции,
а конструкция use const — константы.
<?php
namespace Name\Space {
const FOO = 42;
function f()
{
echo __FUNCTION__."\n";
}
}
namespace {
use const Name\Space\FOO;
use function Name\Space\f;
echo FOO."\n";
f();
}
?>Результат выполнения приведённого примера:
42 Name\Space\f
phpdbg
Теперь PHP содержит интерактивный отладчик phpdbg, который реализовали как SAPI-модуль. Подробности даёт документация к модулю phpdbg.
Кодировка по умолчанию
Для функций htmlentities(), html_entity_decode() и htmlspecialchars() добавили директиву default_charset, которая устанавливает набор символов по умолчанию. Обратите внимание: при установке параметров кодировки для модулей iconv и mbstring, которые теперь устарели, они будут иметь приоритет над ini-параметром default_charset для функций модулей iconv и mbstring.
Значение по умолчанию для настройки — UTF-8.
Переиспользование обёртки php://input
Поток php://input
теперь разрешается переоткрывать и считывать столько раз, сколько требуется.
Эта работа также значительно сократила объём памяти, который требуется для обработки
данных POST-запросов.
Загрузка больших файлов
Теперь разрешается загружать файлы размером больше 2 ГБ.
Модуль GMP поддерживает перегрузку операторов
Объекты GMP теперь поддерживают перегрузку операторов и приведение к скалярным типам. Перегрузка операторов делает код с функциями модуля GMP выразительнее:
<?php
$a = gmp_init(42);
$b = gmp_init(17);
if (version_compare(PHP_VERSION, '5.6', '<')) {
echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>Результат выполнения приведённого примера:
59 59 59
Безопасное сравнение строк функцией hash_equals() для предотвращения атак по времени
Добавили функцию hash_equals() для сравнения двух строк за постоянное время. Функция снижает риск атаки по времени; например, во время тестирования хеширования паролей функцией crypt(), когда невозможно использовать функции password_hash() и password_verify(), которые не чувствительны к атакам по времени.
<?php
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>Результат выполнения приведённого примера:
bool(true) bool(false)
Метод __debugInfo()
Добавили магический метод __debugInfo(), который разрешает объектам изменять свойства и значения, которые отображаются при выводе объекта функцией var_dump().
<?php
class C
{
private $prop;
public function __construct($val)
{
$this->prop = $val;
}
public function __debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>Результат выполнения приведённого примера:
object(C)#1 (1) {
["propSquared"]=>
int(1764)
}
Алгоритм хеширования gost-crypto
Добавили алгоритм хеширования gost-crypto.
Алгоритм реализует функцию хеширования GOST, с которой работают в таблицах CryptoPro S-box,
которые определяет секция 11.2 стандарта » RFC 4357.
Улучшение в протоколах SSL/TLS
В поддержку протоколов SSL/TLS в PHP 5.6 внесли широкий спектр улучшений. К улучшениям относятся: включение одноранговой проверки по умолчанию, поддержка сопоставления отпечатков сертификатов, снижение защита от атак повторного согласования по протоколу TLS и много новых параметров SSL-контекста, которые помогают точнее контролировать параметры протокола и проверки при работе с зашифрованными потоками.
Подробнее изменения описывает раздел руководства «Изменения OpenSSL в PHP 5.6.x».
Поддержка асинхронности в модуле pgsql
Модуль pgsql теперь поддерживает асинхронные
соединения и запросы, чем разрешает неблокирующее взаимодействие с базами данных
PostgreSQL. Асинхронные соединения разрешается устанавливать через константу
PGSQL_CONNECT_ASYNC, а новые функции
pg_connect_poll(), pg_socket(),
pg_consume_input() и pg_flush() помогают
обрабатывать асинхронные соединения и запросы.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Constant expressions
It is now possible to provide a scalar expression involving numeric and string literals and/or constants in contexts where PHP previously expected a static value, such as constant and property declarations and default function arguments.
<?php
const ONE = 1;
const TWO = ONE * 2;
class C {
const THREE = TWO + 1;
const ONE_THIRD = ONE / self::THREE;
const SENTENCE = 'The value of THREE is '.self::THREE;
public function f($a = ONE + self::THREE) {
return $a;
}
}
echo (new C)->f()."\n";
echo C::SENTENCE;
?>The above example will output:
4 The value of THREE is 3
It is also now possible to define a constant array using the
const keyword:
<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>The above example will output:
a
Variadic functions via ...
Variadic functions can
now be implemented using the ... operator, instead of
relying on func_get_args().
<?php
function f($req, $opt = null, ...$params) {
// $params is an array containing the remaining arguments.
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>The above example will output:
$req: 1; $opt: 0; number of params: 0 $req: 1; $opt: 2; number of params: 0 $req: 1; $opt: 2; number of params: 1 $req: 1; $opt: 2; number of params: 2 $req: 1; $opt: 2; number of params: 3
Argument unpacking via ...
Arrays and
Traversable objects can be unpacked into
argument lists when calling functions by using the ...
operator. This is also known as the splat operator in other languages,
including Ruby.
<?php
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>The above example will output:
6
Exponentiation via **
A right associative ** operator has been added to
support exponentiation, along with a **= shorthand
assignment operator.
<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>The above example will output:
2 ** 3 == 8 2 ** 3 ** 2 == 512 a == 8
use function and use const
The
use
operator has been extended to support importing functions and constants in
addition to classes. This is achieved via the
use function and use const
constructs, respectively.
<?php
namespace Name\Space {
const FOO = 42;
function f() { echo __FUNCTION__."\n"; }
}
namespace {
use const Name\Space\FOO;
use function Name\Space\f;
echo FOO."\n";
f();
}
?>The above example will output:
42 Name\Space\f
phpdbg
PHP now includes an interactive debugger called phpdbg implemented as a SAPI module. For more information, please visit the phpdbg documentation.
Default character encoding
default_charset is now used as the default character set for the htmlentities(), html_entity_decode() and htmlspecialchars() functions. Note that if the (now deprecated) iconv and mbstring encoding settings are set, they will take precedence over default_charset for iconv and mbstring functions, respectively.
The default value for this setting is UTF-8.
php://input is reusable
php://input
may now be reopened and read as many times as required. This work has also
resulted in a major reduction in the amount of memory required to deal
with POST data.
Large file uploads
Files larger than 2 gigabytes in size are now accepted.
GMP supports operator overloading
GMP objects now support operator overloading and casting to scalar types. This allows for more expressive code using GMP:
<?php
$a = gmp_init(42);
$b = gmp_init(17);
if (version_compare(PHP_VERSION, '5.6', '<')) {
echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>The above example will output:
59 59 59
hash_equals() for timing attack safe string comparison
The hash_equals() function has been added to compare two strings in constant time. This should be used to mitigate timing attacks; for instance, when testing crypt() password hashes (assuming that you are unable to use password_hash() and password_verify(), which aren't susceptible to timing attacks).
<?php
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>The above example will output:
bool(true) bool(false)
__debugInfo()
The __debugInfo() magic method has been added to allow objects to change the properties and values that are shown when the object is output using var_dump().
<?php
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>The above example will output:
object(C)#1 (1) {
["propSquared"]=>
int(1764)
}
gost-crypto hash algorithm
The gost-crypto hash algorithm has been added. This
implements the GOST hash function using the CryptoPro S-box tables as
specified by
» RFC 4357, section 11.2.
SSL/TLS improvements
A wide range of improvements have been made to the SSL/TLS support in PHP 5.6. These include enabling peer verification by default, supporting certificate fingerprint matching, mitigating against TLS renegotiation attacks, and many new SSL context options to allow more fine grained control over protocol and verification settings when using encrypted streams.
These changes are described in more detail in the OpenSSL changes in PHP 5.6.x section of this migration guide.
pgsql async support
The pgsql extension now supports
asynchronous connections and queries, thereby enabling non-blocking
behaviour when interacting with PostgreSQL databases. Asynchronous
connections may be established via the
PGSQL_CONNECT_ASYNC constant, and the new
pg_connect_poll(), pg_socket(),
pg_consume_input() and pg_flush()
functions may be used to handle asynchronous connections and queries.
PHP 5.5 → 5.6: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 5.5 → 5.6: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 5.5 → 5.6: Изменения поведения функций
У знакомого имени мог измениться договор: параметры, тип результата, предупреждение или исключение. Проверяют фактические входы проекта и добавляют тест на старое граничное значение.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ядро PHP
crypt() теперь генерирует предупреждение
E_NOTICE, если параметрsaltопущен.substr_compare() теперь принимает
0в качестве значения параметраlength.unserialize() теперь терпит неудачу, если переданы сериализованные данные, которые были изменены в попытке инстанциировать объект без вызова его конструктора.
cURL
Загрузка на сервер с использованием синтаксиса
@fileтеперь поддерживается, только если опцияCURLOPT_SAFE_UPLOADустановлена вfalse. Вместо этого следует пользоваться CURLFile .
Mcrypt
Параметр
sourceфункции mcrypt_create_iv() теперь имеет значение по умолчаниюMCRYPT_DEV_URANDOMвместоMCRYPT_DEV_RANDOM.
OpenSSL
stream_socket_enable_crypto() теперь позволяет не указывать параметр
crypto_type, если контекст потока SSL включает новую опциюcrypto_type.
PostgreSQL
pg_insert(), pg_select(), pg_update() и pg_delete() больше не являются экспериментальными.
pg_send_execute(), pg_send_prepare(), pg_send_query() и pg_send_query_params() больше не блокируются до завершения записи запроса, если нижележащий поток сокета для соединения с базой данных находится в неблокирующем режиме.
Reflection
ReflectionClass::newInstanceWithoutConstructor() теперь позволяет создавать экземпляры из неокончательных (non-final) внутренних классов.
XMLReader
XMLReader::getAttributeNs() и XMLReader::getAttributeNo() теперь возвращают
null, если атрибут не может быть найден, как это делает XMLReader::getAttribute().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP Core
crypt() will now raise an
E_NOTICEerror if thesaltparameter is omitted.substr_compare() will now accept
0for itslengthparameter.unserialize() will now fail if passed serialised data that has been manipulated to attempt to instantiate an object without calling its constructor.
cURL
Uploads using the
@filesyntax are now only supported if theCURLOPT_SAFE_UPLOADoption is set tofalse. CURLFile should be used instead.
Mcrypt
The
sourceparameter of mcrypt_create_iv() now defaults toMCRYPT_DEV_URANDOMinstead ofMCRYPT_DEV_RANDOM.
OpenSSL
stream_socket_enable_crypto() now allows the
crypto_typeparameter to be optional if the stream's SSL context includes the newcrypto_typeoption.
PostgreSQL
pg_insert(), pg_select(), pg_update() and pg_delete() are no longer experimental.
pg_send_execute(), pg_send_prepare(), pg_send_query() and pg_send_query_params() will no longer block until query write completion if the underlying socket stream for the database connection is set to non-blocking mode.
Reflection
ReflectionClass::newInstanceWithoutConstructor() now allows non-final internal classes to be instantiated.
XMLReader
XMLReader::getAttributeNs() and XMLReader::getAttributeNo() now return
nullif the attribute could not be found, like XMLReader::getAttribute().
PHP 5.5 → 5.6: Обратно несовместимые изменения
Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Хотя большая часть существующего кода PHP 5 должна работать без изменений, всё же ознакомьтесь с некоторыми изменениями, которые могут сказаться на обратной совместимости:
Ключи массива не будут перезаписываться при определении массива как свойства класса через литерал массива
Раньше объявленные как свойства класса массивы, в которых смешались явные и неявные ключи, могли без предупреждения перезаписывать элементы массива, если явный ключ пересекался с последовательным неявным ключом. Например:
<?php
class C
{
const ONE = 1;
public $array = [
self::ONE => 'foo',
'bar',
'quux',
];
}
var_dump((new C())->array);
?>Результат выполнения приведённого примера в PHP 5.5:
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(4) "quux"
}
Результат выполнения приведённого примера в PHP 5.6:
array(3) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(4) "quux"
}
Строгость json_decode()
Теперь функция json_decode() в соответствии со
спецификацией JSON отклоняет JSON-литералы
true, false и
null, которые задали не строго в нижнем регистре,
и, соответственно, устанавливает
код ошибки для функции json_last_error(). Раньше данные,
которые передавались в функцию json_decode()
и содержали исключительно одно из этих значений в верхнем
или смешанном регистре, принимались.
Это изменение повлияет только в случае передачи в функцию json_decode() некорректного JSON. В случае корректно сформированного JSON никакого эффекта не будет.
Теперь потоковые обёртки по умолчанию проверяют сертификаты точек при использовании SSL/TLS
Все шифруемые клиентские потоки теперь по умолчанию включают проверку пиров. По умолчанию сертификат пира проверяется пакетом OpenSSL CA. Обычно не нужно ничего делать для соединения с серверами с правильным SSL-сертификатом, так как OpenSSL настроен так, что уже работает с хорошими CA-пакетами.
Стандартный CA пакет может быть переопределён глобально с помощью
установки или openssl.cafile или openssl.capath строк конфигурации,
или же на уровне каждого запроса используя опции контекста
cafile или
capath.
Хотя это и не рекомендуется, но можно отключить проверку сертификата пира
для запроса, установив verify_peer
опцию контекста в false, и можно отключить проверку имени пира, установив
verify_peer_name в false.
Ресурсы GMP стали объектами
Теперь ресурсы GMP — объекты. Функциональный API, который реализовали в модуле GMP, остался без изменений. Существующий код должен заработать без изменений, только если в нём явно не использовались проверки на ресурс is_resource() или что-то подобное.
Теперь функция Mcrypt требует корректные ключи и IV
mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic() и mcrypt_ofb() больше не принимают ключи и IV с некорректной длиной, а режимы блочного шифра, требующие IV, будут завершаться с ошибкой, если его не передать.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Although most existing PHP 5 code should work without changes, please take note of some backward incompatible changes:
Array keys won't be overwritten when defining an array as a property of a class via an array literal
Previously, arrays declared as class properties which mixed explicit and implicit keys could have array elements silently overwritten if an explicit key was the same as a sequential implicit key. For example:
<?php
class C {
const ONE = 1;
public $array = [
self::ONE => 'foo',
'bar',
'quux',
];
}
var_dump((new C)->array);
?>Output of the above example in PHP 5.5:
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(4) "quux"
}
Output of the above example in PHP 5.6:
array(3) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(4) "quux"
}
json_decode() strictness
json_decode() now rejects non-lowercase variants of the
JSON literals true, false and
null at all times, as per the JSON specification, and
sets json_last_error() accordingly. Previously, inputs
to json_decode() that consisted solely of one of these
values in upper or mixed case were accepted.
This change will only affect cases where invalid JSON was being passed to json_decode(): valid JSON input is unaffected and will continue to be parsed normally.
Stream wrappers now verify peer certificates and host names by default when using SSL/TLS
All encrypted client streams now enable peer verification by default. By default, this will use OpenSSL's default CA bundle to verify the peer certificate. In most cases, no changes will need to be made to communicate with servers with valid SSL certificates, as distributors generally configure OpenSSL to use known good CA bundles.
The default CA bundle may be overridden on a global basis by setting
either the openssl.cafile or openssl.capath configuration setting, or on a
per request basis by using the
cafile or
capath
context options.
While not recommended in general, it is possible to disable peer
certificate verification for a request by setting the
verify_peer
context option to false, and to disable peer name validation by setting
the verify_peer_name
context option to false.
GMP resources are now objects
GMP resources are now objects. The functional API implemented in the GMP extension has not changed, and code should run unmodified unless it checks explicitly for a resource using is_resource() or similar.
Mcrypt functions now require valid keys and IVs
mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic() and mcrypt_ofb() will no longer accept keys or IVs with incorrect sizes, and block cipher modes that require IVs will now fail if an IV isn't provided.
PHP 5.5 → 5.6: Устаревшие возможности
Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Вызовы из несовместимого контекста
Методы, вызываемые из несовместимого контекста объявлены устаревшими и будут
вызывать ошибку уровня E_DEPRECATED вместо
E_STRICT. В будущих версиях PHP поддержка этих вызовов будет удалена.
Примером такого вызова является:
<?php
class A {
function f() { echo get_class($this); }
}
class B {
function f() { A::f(); }
}
(new B)->f();
?>Результат выполнения приведённого примера:
Deprecated: Non-static method A::f() should not be called statically, assuming $this from incompatible context in - on line 7 B
$HTTP_RAW_POST_DATA и always_populate_raw_post_data
always_populate_raw_post_data
теперь будет вызывать ошибку E_DEPRECATED, если
$HTTP_RAW_POST_DATA заполнен.
Новый код должен использовать
php://input
вместо $HTTP_RAW_POST_DATA, который будет удалён в будущих
версиях PHP. Вы можете выбрать новое поведение (в котором
$HTTP_RAW_POST_DATA никогда не определяется, следовательно,
E_DEPRECATED не будет генерировать ошибку) путём установки
always_populate_raw_post_data
в -1.
Настройки кодирования iconv и mbstring
Параметры конфигурации
iconv и
mbstring, связанные с кодированием, устарели в пользу
default_charset.
Устаревшие опции:
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Calls from incompatible context
Methods called from an incompatible context are now deprecated, and will
generate E_DEPRECATED errors when invoked instead of
E_STRICT. Support for these calls will be removed in
a future version of PHP.
An example of such a call is:
<?php
class A {
function f() { echo get_class($this); }
}
class B {
function f() { A::f(); }
}
(new B)->f();
?>The above example will output:
Deprecated: Non-static method A::f() should not be called statically, assuming $this from incompatible context in - on line 7 B
$HTTP_RAW_POST_DATA and always_populate_raw_post_data
always_populate_raw_post_data
will now generate an E_DEPRECATED error when
$HTTP_RAW_POST_DATA is populated.
New code should use
php://input
instead of $HTTP_RAW_POST_DATA, which will be removed
in a future release. You can opt in for the new behaviour (in which
$HTTP_RAW_POST_DATA is never defined hence no
E_DEPRECATED error will be generated) by setting
always_populate_raw_post_data
to -1.
iconv and mbstring encoding settings
The iconv and
mbstring configuration options related
to encoding have been deprecated in favour of
default_charset.
The deprecated options are:
PHP 5.5 → 5.6: Изменения расширений
Изменения расширений важны только вместе с точной сборкой. Сверяют загруженные модули, их версии, конфигурацию и ABI, а не только PHP_VERSION.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
cURL
Ряд констант, помеченные как устаревшие в библиотеке cURL, теперь будут удалены:
CURLOPT_CLOSEPOLICYCURLCLOSEPOLICY_CALLBACKCURLCLOSEPOLICY_LEAST_RECENTLY_USEDCURLCLOSEPOLICY_LEAST_TRAFFICCURLCLOSEPOLICY_OLDESTCURLCLOSEPOLICY_SLOWEST
OCI8
Поддержка неявных наборов результатов для Oracle Database 12c была добавлена с помощью новой функции oci_get_implicit_resultset().
С помощью
oci_execute($s, OCI_NO_AUTO_COMMIT), для SELECT больше необязательно инициировать внутренний ROLLBACK во время закрытия соединения.Добавлены зонды DTrace, контролируемые с помощью опции конфигурации
--enable-dtrace.oci_internal_debug() теперь ничего не делает.
Формат вывода функции phpinfo() для OCI8 изменился.
Zip
Добавлена опция конфигурации --with-libzip, для использования системной
библиотеки libzip. Требуется как минимум libzip версии 0.11, рекомендуется 0.11.2 или более
поздняя.
MySQLi
Была добавлена опция mysqli.rollback_on_cached_plink, которая управляет поведением отката постоянных соединений.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
cURL
A number of constants marked obsolete in the cURL library have now been removed:
CURLOPT_CLOSEPOLICYCURLCLOSEPOLICY_CALLBACKCURLCLOSEPOLICY_LEAST_RECENTLY_USEDCURLCLOSEPOLICY_LEAST_TRAFFICCURLCLOSEPOLICY_OLDESTCURLCLOSEPOLICY_SLOWEST
OCI8
Support for implicit result sets for Oracle Database 12c has been added via the new oci_get_implicit_resultset() function.
Using
oci_execute($s, OCI_NO_AUTO_COMMIT)for a SELECT no longer unnecessarily initiates an internal ROLLBACK during connection close.Added DTrace probes controlled by the
--enable-dtraceconfigure option.oci_internal_debug() is now a no-op.
The phpinfo() output format for OCI8 has changed.
Zip
A --with-libzip configure option has been added to use
a system libzip installation. libzip version 0.11 is required, with 0.11.2
or later recommended.
MySQLi
A new mysqli.rollback_on_cached_plink option was added, which controls the rollback behavior of persistent connections.
PHP 5.5 → 5.6: Изменения OpenSSL
Криптографические изменения проверяют на копии сертификатов и тестовых ключах, не на боевых секретах. Важны версия OpenSSL, набор алгоритмов и формат ключевого материала.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Обёртки потоков теперь по умолчанию проверяют сертификаты узлов и имена хостов при использовании SSL/TLS
Все шифруемые клиентские потоки теперь по умолчанию включают проверку пиров. По умолчанию сертификат пира проверяется пакетом OpenSSL CA. Обычно не нужно ничего делать для соединения с серверами с правильным SSL-сертификатом, так как OpenSSL настроен так, что уже работает с хорошими CA-пакетами.
Стандартный CA пакет может быть переопределён глобально с помощью
установки или openssl.cafile или openssl.capath строк конфигурации,
или же на уровне каждого запроса используя опции контекста
cafile или
capath.
Хотя это и не рекомендуется, но можно отключить проверку сертификата пира
для запроса, установив verify_peer
опцию контекста в false, и можно отключить проверку имени пира, установив
verify_peer_name в false.
Сигнатура сертификата
Была добавлена поддержка извлечения и проверки сигнатуры сертификата.
Для извлечения сигнатур сертификатов X.509 добавлена функция
openssl_x509_fingerprint(). Также были добавлены две
опции контекста потока SSL:
capture_peer_cert для захвата узлового сертификата X.509,
и peer_fingerprint для проверки сертификата на соответствие
заданной сигнатуре.
Обновлены шифры по умолчанию
Список шифров по умолчанию, используемых PHP, был обновлён на более безопасный в соответствии с » рекомендациями по шифрам от Mozilla, с двумя дополнительными исключениями: анонимные шифры Диффи-Хеллмана и RC4.
Этот список доступен через новую константу
OPENSSL_DEFAULT_STREAM_CIPHERS, и может быть переопределён
(как и в предыдущих версиях PHP) установкой опцией контекста
ciphers.
Сжатие запрещено по умолчанию
Сжатие SSL/TLS было запрещено по умолчанию для compression уменьшения
вероятности атаки типа CRIME. В PHP 5.4.13 была добавлена опция контекста
disable_compression
для возможности запретить компрессию и теперь она по умолчанию установлена
как true (то есть компрессия запрещена).
Разрешение серверу определять свой собственный порядок шифров
Была добавлена опция контекста honor_cipher_order,
которая позволяет серверу обслуживающему зашифрованный поток самому
определять шифры, которыми будет пользоваться клиент. Это позволить снизить
риск атаки типа BEAST.
Доступ к согласованному протоколу и шифру
Протокол и шифр, согласованные для шифрованного потока, доступны
с помощью функций stream_get_meta_data() или
stream_context_get_options(), если опция контекста SSL
capture_session_meta установлена как true.
<?php
$ctx = stream_context_create(['ssl' => [
'capture_session_meta' => TRUE
]]);
$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);
?>Результат выполнения приведённого примера:
array(4) {
["protocol"]=>
string(5) "TLSv1"
["cipher_name"]=>
string(20) "ECDHE-RSA-AES128-SHA"
["cipher_bits"]=>
int(128)
["cipher_version"]=>
string(11) "TLSv1/SSLv3"
}
Новые возможности для совершенной прямой секретности (PFS) для серверов, обслуживающих шифрованные потоки
Шифрованные потоки клиента уже поддерживают совершенную прямую секретность, поскольку она, как правило, контролируется сервером. Серверы PHP, обслуживающие шифрованные потоки, использующие сертификаты поддерживающие совершенную прямую секретность не нуждаются в каких либо дополнительных действиях для включения PFS; однако, было добавлено некоторое количество новых опций контекста SSL для более точного контроля над PFS и для решения возможных проблем.
ecdh_curveЭта опция позволяет выбрать кривую для использования в шифрах ECDH. Если не задано, то будет использоваться
prime256v1.dh_paramПуть к файлу, содержащему параметры для обмена ключами Диффи-Хеллмана, созданного, например, с помощью такой команды:
openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048
single_dh_useЕсли установлено как
true, новая пара ключей будет создана, используя параметры Диффи-Хеллмана, тем самым улучшая прямую секретность.single_ecdh_useЕсли установлено как
true, новая пара ключей будет генерироваться всегда, при согласовании шифра ECDH. Это улучшает прямую секретность.
Выбор версии SSL/TLS
Теперь возможно выбирать конкретную версию SSL и TLS с помощью опции
контекста crypto_method или указывая конкретный
транспорт при создании обёртки потока (например с помощью вызова
stream_socket_client() или
stream_socket_server()).
Опция контекста SSL crypto_method принимает битовую
маску, перечисляющую допустимые протоколы, также как это задаётся в
параметре crypto_type функции
stream_socket_enable_crypto().
| Протокол | Флаг клиента | Флаг сервера | Транспорт |
|---|---|---|---|
| Любые версии TLS или SSL | STREAM_CRYPTO_METHOD_ANY_CLIENT | STREAM_CRYPTO_METHOD_ANY_SERVER | ssl:// |
| Любая версия TLS | STREAM_CRYPTO_METHOD_TLS_CLIENT | STREAM_CRYPTO_METHOD_TLS_SERVER | tls:// |
| TLS 1.0 | STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | tlsv1.0:// |
| TLS 1.1 | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | tlsv1.1:// |
| TLS 1.2 | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER | tlsv1.2:// |
| SSL 3 | STREAM_CRYPTO_METHOD_SSLv3_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_SERVER | sslv3:// |
<?php
// Требуется TLS 1.0 или выше для использования file_get_contents():
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);
// Требуется TLS 1.1 или 1.2:
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT |
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);
// Соединяемся с использованием транспорта потокового сокета tlsv1.2://
$sock = stream_socket_client('tlsv1.2://google.com:443/');
?>Добавлена функция openssl_get_cert_locations()
Была добавлена функция openssl_get_cert_locations(): она возвращает расположения, в которых PHP будет искать пакеты CA по умолчанию.
<?php
var_dump(openssl_get_cert_locations());
?>Результат выполнения приведённого примера:
array(8) {
["default_cert_file"]=>
string(21) "/etc/pki/tls/cert.pem"
["default_cert_file_env"]=>
string(13) "SSL_CERT_FILE"
["default_cert_dir"]=>
string(18) "/etc/pki/tls/certs"
["default_cert_dir_env"]=>
string(12) "SSL_CERT_DIR"
["default_private_dir"]=>
string(20) "/etc/pki/tls/private"
["default_default_cert_area"]=>
string(12) "/etc/pki/tls"
["ini_cafile"]=>
string(0) ""
["ini_capath"]=>
string(0) ""
}
Поддержка SPKI
Была добавлена поддержка для создания, извлечения и проверки подписанных
публичных ключей и опознавательных строк (SPKAC).
Были добавлены функции openssl_spki_new(),
openssl_spki_verify(),
openssl_spki_export_challenge() и
openssl_spki_export() для создания, проверки экспорта PEM
публичных ключей и соответствующих опознавательных строк из SPKAC,
созданных из элементов HTML5 KeyGen.
openssl_spki_newГенерация нового SPKAC с использованием приватного ключа, опознавательной строки и алгоритма хеширования.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); ?>Результат выполнения приведённого примера:
SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7
openssl_spki_verifyПроверка предоставленного SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); var_dump(openssl_spki_verify($spkac)); ?>openssl_spki_export_challengeЭкспорт связанной опознавательной строки из предоставленного SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); $challenge = openssl_spki_export_challenge($spkac); echo $challenge; ?>Результат выполнения приведённого примера:
challenge string
openssl_spki_exportЭкспорт публичного ключа (PEM) RSA в формате из SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); echo openssl_spki_export($spkac); ?>Результат выполнения приведённого примера:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7 l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8 MGw/+AwwjHBOwong/QIDAQAB -----END PUBLIC KEY-----
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Stream wrappers now verify peer certificates and host names by default when using SSL/TLS
All encrypted client streams now enable peer verification by default. By default, this will use OpenSSL's default CA bundle to verify the peer certificate. In most cases, no changes will need to be made to communicate with servers with valid SSL certificates, as distributors generally configure OpenSSL to use known good CA bundles.
The default CA bundle may be overridden on a global basis by setting
either the openssl.cafile or openssl.capath configuration setting, or on a
per request basis by using the
cafile or
capath
context options.
While not recommended in general, it is possible to disable peer
certificate verification for a request by setting the
verify_peer
context option to false, and to disable peer name validation by setting
the verify_peer_name
context option to false.
Certificate fingerprints
Support has been added for extracting and verifying certificate
fingerprints. openssl_x509_fingerprint() has been added
to extract a fingerprint from an X.509 certificate, and two
SSL stream context options have been
added: capture_peer_cert to capture the peer's X.509
certificate, and peer_fingerprint to assert that the
peer's certificate should match the given fingerprint.
Default ciphers updated
The default ciphers used by PHP have been updated to a more secure list based on the » Mozilla cipher recommendations, with two additional exclusions: anonymous Diffie-Hellman ciphers, and RC4.
This list can be accessed via the new
OPENSSL_DEFAULT_STREAM_CIPHERS constant, and can be
overridden (as in previous PHP versions) by setting the
ciphers
context option.
Compression disabled by default
SSL/TLS compression has been disabled by default to mitigate the CRIME
attack. PHP 5.4.13 added a
disable_compression
context option to allow compression to be disabled: this is now set to
true (that is, compression is disabled) by default.
Allow servers to prefer their cipher order
The honor_cipher_order SSL context option has been
added to allow encrypted stream servers to mitigate BEAST vulnerabilities
by preferring the server's ciphers to the client's.
Access the negotiated protocol and cipher
The protocol and cipher that were negotiated for an encrypted stream can
now be accessed via stream_get_meta_data() or
stream_context_get_options() when the
capture_session_meta SSL context option is set to
true.
<?php
$ctx = stream_context_create(['ssl' => [
'capture_session_meta' => TRUE
]]);
$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);
?>The above example will output:
array(4) {
["protocol"]=>
string(5) "TLSv1"
["cipher_name"]=>
string(20) "ECDHE-RSA-AES128-SHA"
["cipher_bits"]=>
int(128)
["cipher_version"]=>
string(11) "TLSv1/SSLv3"
}
New options for perfect forward secrecy in encrypted stream servers
Encrypted client streams already support perfect forward secrecy, as it is generally controlled by the server. PHP encrypted server streams using certificates capable of perfect forward secrecy do not need to take any additional action to enable PFS; however a number of new SSL context options have been added to allow more control over PFS and deal with any compatibility issues that may arise.
ecdh_curveThis option allows the selection of a specific curve for use with ECDH ciphers. If not specified,
prime256v1will be used.dh_paramA path to a file containing parameters for Diffie-Hellman key exchange, such as that created by the following command:
openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048
single_dh_useIf set to
true, a new key pair will be created when using Diffie-Hellman parameters, thereby improving forward secrecy.single_ecdh_useIf set to
true, a new key pair will always be generated when ECDH cipher suites are negotiated. This improves forward secrecy.
SSL/TLS version selection
It is now possible to select specific versions of SSL and TLS via the
crypto_method SSL context option or by specifying a
specific transport when creating a stream wrapper (for example, by calling
stream_socket_client() or
stream_socket_server()).
The crypto_method SSL context option accepts a
bitmask enumerating the protocols that are permitted, as does the
crypto_type of
stream_socket_enable_crypto().
| Protocol(s) | Client flag | Server flag | Transport |
|---|---|---|---|
| Any TLS or SSL version | STREAM_CRYPTO_METHOD_ANY_CLIENT | STREAM_CRYPTO_METHOD_ANY_SERVER | ssl:// |
| Any TLS version | STREAM_CRYPTO_METHOD_TLS_CLIENT | STREAM_CRYPTO_METHOD_TLS_SERVER | tls:// |
| TLS 1.0 | STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | tlsv1.0:// |
| TLS 1.1 | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | tlsv1.1:// |
| TLS 1.2 | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER | tlsv1.2:// |
| SSL 3 | STREAM_CRYPTO_METHOD_SSLv3_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_SERVER | sslv3:// |
<?php
// Requiring TLS 1.0 or better when using file_get_contents():
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);
// Requiring TLS 1.1 or 1.2:
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT |
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);
// Connecting using the tlsv1.2:// stream socket transport.
$sock = stream_socket_client('tlsv1.2://google.com:443/');
?>openssl_get_cert_locations() added
The openssl_get_cert_locations() function has been added: it returns the default locations PHP will search when looking for CA bundles.
<?php
var_dump(openssl_get_cert_locations());
?>The above example will output:
array(8) {
["default_cert_file"]=>
string(21) "/etc/pki/tls/cert.pem"
["default_cert_file_env"]=>
string(13) "SSL_CERT_FILE"
["default_cert_dir"]=>
string(18) "/etc/pki/tls/certs"
["default_cert_dir_env"]=>
string(12) "SSL_CERT_DIR"
["default_private_dir"]=>
string(20) "/etc/pki/tls/private"
["default_default_cert_area"]=>
string(12) "/etc/pki/tls"
["ini_cafile"]=>
string(0) ""
["ini_capath"]=>
string(0) ""
}
SPKI support
Support has been added for generating, extracting and verifying signed
public key and challenges (SPKAC). openssl_spki_new(),
openssl_spki_verify(),
openssl_spki_export_challenge(), and
openssl_spki_export() have been added to create, verify
export PEM public key and associated challenge from
SPKAC's generated from a KeyGen HTML5 element.
openssl_spki_newGenerates a new SPKAC using private key, challenge string and hashing algorithm.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); ?>The above example will output:
SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7
openssl_spki_verifyVerifies provided SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); var_dump(openssl_spki_verify($spkac)); ?>openssl_spki_export_challengeExports associated challenge from provided SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); $challenge = openssl_spki_export_challenge($spkac); echo $challenge; ?>The above example will output:
challenge string
openssl_spki_exportExports the PEM formatted RSA public key from SPKAC.
<?php $pkey = openssl_pkey_new(); openssl_pkey_export($pkey, 'secret passphrase'); $spkac = openssl_spki_new($pkey, 'challenge string'); echo openssl_spki_export($spkac); ?>The above example will output:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7 l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8 MGw/+AwwjHBOwong/QIDAQAB -----END PUBLIC KEY-----
PHP 5.6 → 7.0
Этот узел — контрольная карта перехода PHP 5.6 → 7.0. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Изменения, которые ломают обратную совместимость
- Новая функциональность
- Функциональность, объявленная устаревшей в PHP 7.0.x
- Изменённые функции
- Новые функции
- Новые классы и интерфейсы
- Новые глобальные константы
- Изменения в модулях SAPI
- Удалённые модули и SAPI
- Другие изменения
Несмотря на то что PHP 7.0 — новая основная версия, были предприняты усилия, чтобы сделать миграцию максимально безболезненной. Этот релиз в основном ориентирован на удаление функциональных возможностей, которые объявили устаревшими в предыдущих версиях, и улучшения согласованности языка.
Требуется учесть несовместимости и новую функциональность, и протестировать код перед переключением версий PHP в производственных окружениях.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- Backward incompatible changes
- New features
- Deprecated features in PHP 7.0.x
- Changed functions
- New functions
- New Classes and Interfaces
- New Global Constants
- Changes in SAPI Modules
- Removed Extensions and SAPIs
- Other Changes
Despite the fact that PHP 7.0 is a new major version, efforts have been made to make migration as painless as possible. This release focuses mainly on removing functionality deprecated in previous versions and improving language consistency.
There are a few incompatibilities and new features that should be considered, and code should be tested before switching PHP versions in production environments.
PHP 5.6 → 7.0: Новые возможности языка и платформы
Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.
Полный официальный договор страницы — большой справочник, раскрывается по запросу
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Объявления скалярных типов
Скалярные типы объявляют в двух режимах: нестрогом, в котором PHP работает по умолчанию, и строгом. Теперь как в нестрогом, так и в строгом режимах разрешается задавать следующие типы параметров: строки (string), целые числа (int), числа с плавающей точкой (float) и логические значения (bool). Перечисленные типы дополняют другие типы, которые появились в PHP 5: имена классов, интерфейсов, массивы (array) и callable.
<?php
// Нестрогий режим с приведением типов
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));
?>Результат выполнения приведённого примера:
int(9)
Для установки строгого режима, в самом начале файла необходимо поместить одну
директиву declare. Это означает, что строгость объявления скалярных типов
работает на уровне файла и
не затрагивает весь остальной код. Эта директива затрагивает не только объявления
параметров, но и возвращаемые значения функций (смотрите
объявления возвращаемого типа),
встроенные функции PHP и функции загруженных модулей.
Подробную документацию и примеры использования читайте в разделе декларация типов.
Объявления возвращаемых значений
В PHP 7 добавлена поддержка объявления возвращаемого типа. Аналогично как и объявления типов аргументов, объявление типа возвращаемого значения указывает, значение какого типа должна вернуть функция. Для объявления типа возвращаемого значения доступны все те же типы, что и для объявления типов аргументов.
<?php
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
?>Результат выполнения приведённого примера:
Array
(
[0] => 6
[1] => 15
[2] => 24
)
Полную документацию и примеры использования читайте в разделе про объявление возвращаемого типа.
Оператор объединения с null
Был добавлен оператор объединения с null (??), являющийся
синтаксическим сахаром для достаточно распространённого действия, когда совместно
используются тернарный оператор и функция isset(). Он возвращает
первый операнд, если он задан и не равен null, а в обратном случае возвращает второй
операнд.
<?php
// Извлекаем значение $_GET['user'], а если оно не задано,
// то возвращаем 'nobody'
$username = $_GET['user'] ?? 'nobody';
// Это идентично следующему коду:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Этот оператор можно использовать в цепочке.
// В этом примере мы сперва проверяем, задан ли $_GET['user'], если нет,
// то проверяем $_POST['user'], и если он тоже не задан, то присваеваем 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>Оператор spaceship (космический корабль)
Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b. Сравнение производится в соответствии с правилами сравнения типов PHP.
<?php
// Целые числа
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Числа с плавающей точкой
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Строки
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>Определение констант массивов с помощью define()
Можно определить константу типа array с помощью функции
define(). В PHP 5.6 такие константы можно было задавать только с
помощью const.
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // выводит "cat"
?>Анонимные классы
Была добавлена поддержка анонимных классов с помощью new class.
Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный
класс, а потом его объект не имеет смысла:
<?php
interface Logger
{
public function log(string $msg);
}
class Application
{
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>Результат выполнения приведённого примера:
object(class@anonymous)#2 (0) {
}
Подробную документацию и примеры использования читайте в разделе про анонимные классы.
Синтаксис экранирования кодовых точек Юникода
Синтаксис принимает кодовую точку Юникода в шестнадцатеричном формате, которую записали в кодировке UTF-8 как строку в двойных кавычках или heredoc-синтаксисом, и выводит эту кодовую точку в формате UTF-8. Синтаксис примет каждую допустимую кодовую точку. Ведущие нули в шестнадцатеричной последовательности указывать необязательно.
<?php
echo "\u{aa}", PHP_EOL;
echo "\u{0000aa}", PHP_EOL;
echo "\u{9999}", PHP_EOL;
echo <<<EOT
\u{01f418}
EOT;
?>Результат выполнения приведённого примера:
ª ª (То же, что и первый вариант, но с ведущими нулями) 香
Closure::call()
Closure::call() — более производительный и короткий способ временного связывания области действия объекта с замыканием и его вызовом.
<?php
class A
{
private $x = 1;
}
// До PHP 7
$getX = function() {
return $this->x;
};
$getXCB = $getX->bindTo(new A, 'A'); // Промежуточное замыкание
echo $getXCB();
// PHP 7+
$getX = function() {
return $this->x;
};
echo $getX->call(new A);
?>Результат выполнения приведённого примера:
1 1
unserialize() с фильтрацией
Эта функциональность обеспечивает более высокий уровень безопасности при десериализации объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию кода, позволяя разработчику использовать белый список классов для десериализации.
<?php
// Преобразование всех объектов в __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => false]);
// Преобразование всех объектов, кроме MyClass и MyClass2 в __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
// Поведение по умолчанию принимает все классы (можно просто не задавать второй аргумент)
$data = unserialize($foo, ["allowed_classes" => true]);
?>IntlChar
Новый класс IntlChar добавляет новую функциональность в ICU. Класс определяет несколько статических методов и констант для манипулирования символами Unicode.
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
?>Результат выполнения приведённого примера:
10ffff COMMERCIAL AT bool(true)
Для работы с этим классом требуется установить модуль Intl.
Ожидания
Ожидания являются улучшенной, обратно совместимой версией старой функции assert(). Они позволяют делать предположения с нулевой стоимостью в промышленном коде и предоставляют возможность выбрасывать пользовательские исключения в случае провала ожидания.
Вместе тем, что старое API поддерживается, assert() теперь является языковой конструкцией, принимающей первым аргументом выражения, а не только строки (string) для оценки или логические значения (bool) для проверки.
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Сообщение об ошибке'));
?>Результат выполнения приведённого примера:
Fatal error: Uncaught CustomError: Сообщение об ошибке
Подробное описание этого функционала, а также инструкции для его конфигурирования для тестовых и промышленных сред, можно найти на странице руководства, посвящённой функции assert().
Групповые объявления use
Классы, функции и константы импортируемые из одного и того же namespace,
теперь можно группировать в одном операторе use.
<?php
// До PHP 7
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>Выражение return в генераторах
Эта функциональность добавлена к генераторам, введённым в PHP 5.5.
Она позволяет использовать оператор return в генераторах в качестве
окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно
извлечь с помощью нового метода Generator::getReturn(), который можно
использовать только после того, как генератор вернул все сгенерированные значение.
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
?>Результат выполнения приведённого примера:
1 2 3
Явно получать конечное значение генератора полезно, поскольку разрешает клиентскому коду, который запустил генератор, получать и обрабатывать финальное значение генератора (возможно, из какой-то формы сопрограммных вычислений). Это значительно проще, чем заставлять клиентский код проверять, последнее ли значение вернул генератор, а затем, если это так, отдельно обрабатывать значение.
Делегация генератора
Теперь генераторы за счёт конструкции yield from умеют автоматически делегировать
выдачу значений другому генератору, Traversable-объекту
или массиву без написания шаблонного кода во внешнем генераторе.
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>Результат выполнения приведённого примера:
1 2 3 4
Функция целочисленного деления intdiv()
Новая функция intdiv() выполняет целочисленное деление операндов и возвращает результат деления.
<?php
var_dump(intdiv(10, 3));
?>Результат выполнения приведённого примера:
int(3)
Опции сессий
Теперь функция session_start() принимает массив опций, которые переопределят конфигурационные директивы сессии файла в php.ini.
Опции также расширили включённой по умолчанию опцией
session.lazy_write, которая говорит PHP,
что файл сессии нужно перезаписывать, только если изменились данные сессии,
и опцией read_and_close, которую можно задать только через
функцию session_start(), чтобы PHP закрывал сессию сразу
после прочтения данных сессии и не вносил в сессию каких-либо изменений.
Приведём пример. Для установки директиве
session.cache_limiter значения
private и немедленному закрытию сессии после чтения данных сессии:
<?php
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
?>preg_replace_callback_array()
Новая функция preg_replace_callback_array() помогает писать более чистый код, когда требуется вызвать функцию preg_replace_callback(). До PHP 7 при обработке отдельных регулярных выражений отдельными функциями приходилось для каждой такой обработки писать отдельный вызов функции.
Теперь можно использовать одну функцию и передавать в неё ассоциативный массив, в котором ключи — регулярные выражения, а значения — функции обратного вызова.
Функции CSPRNG
Добавили две новые кросс-платформенные функции для генерации криптографически безопасных строк и целых чисел: random_bytes() и random_int().
Функция list() теперь всегда распаковывает объекты, которые реализуют интерфейс ArrayAccess
Раньше функция list() не гарантировала корректную обработку объектов, которые реализуют интерфейс ArrayAccess. Это исправили.
Другие изменения
Добавили возможность доступа к методам и свойствам класса при клонировании, то есть
(clone $foo)->bar().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Scalar type declarations
Scalar
type declarations
come in two flavours: coercive (default) and strict. The following types
for parameters can now be enforced (either coercively or strictly): strings
(string), integers (int), floating-point
numbers (float), and booleans (bool). They
augment the other types introduced in PHP 5: class names, interfaces,
array and callable.
<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));The above example will output:
int(9)
To enable strict mode, a single declare directive must be placed at the
top of the file. This means that the strictness of typing for scalars is
configured on a per-file basis. This directive not only affects the type
declarations of parameters, but also a function's return type (see
return type declarations,
built-in PHP functions, and functions from loaded
extensions.
Full documentation and examples of scalar type declarations can be found in the type declaration reference.
Return type declarations
PHP 7 adds support for return type declarations. Similarly to argument type declarations, return type declarations specify the type of the value that will be returned from a function. The same types are available for return type declarations as are available for argument type declarations.
<?php
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));The above example will output:
Array
(
[0] => 6
[1] => 15
[2] => 24
)
Full documentation and examples of return type declarations can be found in the return type declarations. reference.
Null coalescing operator
The null coalescing operator (??) has been added as
syntactic sugar for the common case of needing to use a ternary in
conjunction with isset(). It returns its first operand
if it exists and is not null; otherwise it returns its second operand.
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>Spaceship operator
The spaceship operator is used for comparing two expressions. It returns -1, 0 or 1 when $a is respectively less than, equal to, or greater than $b. Comparisons are performed according to PHP's usual type comparison rules.
<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>Constant arrays using define()
Array constants can now be defined with
define(). In PHP 5.6, they could only be defined with
const.
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // outputs "cat"
?>Anonymous classes
Support for anonymous classes has been added via new
class. These can be used in place of full class definitions for
throwaway objects:
<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>The above example will output:
object(class@anonymous)#2 (0) {
}
Full documentation can be found in the anonymous class reference.
Unicode codepoint escape syntax
This takes a Unicode codepoint in hexadecimal form, and outputs that codepoint in UTF-8 to a double-quoted string or a heredoc. Any valid codepoint is accepted, with leading 0's being optional.
<?php
echo "\u{aa}", PHP_EOL;
echo "\u{0000aa}", PHP_EOL;
echo "\u{9999}", PHP_EOL;
echo <<<EOT
\u{01f418}
EOT;
?>The above example will output:
ª ª (same as before but with optional leading 0's) 香
Closure::call()
Closure::call() is a more performant, shorthand way of temporarily binding an object scope to a closure and invoking it.
<?php
class A {private $x = 1;}
// Pre PHP 7 code
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A'); // intermediate closure
echo $getXCB();
// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);The above example will output:
1 1
Filtered unserialize()
This feature seeks to provide better security when unserializing objects on untrusted data. It prevents possible code injections by enabling the developer to whitelist classes that can be unserialized.
<?php
// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);
// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);IntlChar
The new IntlChar class seeks to expose additional ICU functionality. The class itself defines a number of static methods and constants that can be used to manipulate unicode characters.
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));The above example will output:
10ffff COMMERCIAL AT bool(true)
In order to use this class, the Intl extension must be installed.
Expectations
Expectations are a backwards compatible enhancement to the older assert() function. They allow for zero-cost assertions in production code, and provide the ability to throw custom exceptions when the assertion fails.
While the old API continues to be maintained for compatibility, assert() is now a language construct, allowing the first parameter to be an expression rather than just a string to be evaluated or a bool value to be tested.
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>The above example will output:
Fatal error: Uncaught CustomError: Some error message
Full details on this feature, including how to configure it in both development and production environments, can be found on the manual page of the assert() language construct.
Group use declarations
Classes, functions and constants being imported from the same namespace
can now be grouped together in a single use statement.
<?php
// Pre PHP 7 code
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ code
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>Generator Return Expressions
This feature builds upon the generator functionality introduced into PHP 5.5.
It enables for a return statement to be used within a
generator to enable for a final expression to be returned (return by
reference is not allowed). This value can be fetched using the new
Generator::getReturn() method, which may only be used
once the generator has finished yielding values.
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;The above example will output:
1 2 3
Being able to explicitly return a final value from a generator is a handy ability to have. This is because it enables for a final value to be returned by a generator (from perhaps some form of coroutine computation) that can be specifically handled by the client code executing the generator. This is far simpler than forcing the client code to firstly check whether the final value has been yielded, and then if so, to handle that value specifically.
Generator delegation
Generators can now delegate to another generator,
Traversable object or array
automatically, without needing to write boilerplate in the outermost
generator by using the yield from construct.
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>The above example will output:
1 2 3 4
Integer division with intdiv()
The new intdiv() function performs an integer division of its operands and returns it.
<?php
var_dump(intdiv(10, 3));
?>The above example will output:
int(3)
Session options
session_start() now accepts an array of options that override the session configuration directives normally set in php.ini.
These options have also been expanded to support
session.lazy_write, which is
on by default and causes PHP to only overwrite any session file if the
session data has changed, and read_and_close, which is
an option that can only be passed to session_start() to
indicate that the session data should be read and then the session should
immediately be closed unchanged.
For example, to set
session.cache_limiter to
private and immediately close the session after reading
it:
<?php
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
?>preg_replace_callback_array()
The new preg_replace_callback_array() function enables code to be written more cleanly when using the preg_replace_callback() function. Prior to PHP 7, callbacks that needed to be executed per regular expression required the callback function to be polluted with lots of branching.
Now, callbacks can be registered to each regular expression using an associative array, where the key is a regular expression and the value is a callback.
CSPRNG Functions
Two new functions have been added to generate cryptographically secure integers and strings in a cross platform way: random_bytes() and random_int().
list() can always unpack objects implementing ArrayAccess
Previously, list() was not guaranteed to operate correctly with objects implementing ArrayAccess. This has been fixed.
Other Features
Class member access on cloning has been added, e.g.
(clone $foo)->bar().
<?php
$request = ['page' => '3'];
$page = $request['page'] ?? '1';
$sort = $request['sort'] ?? 'newest';
echo "page={$page}; sort={$sort}\n";
Ожидаемый результат
page=3; sort=newest
Оператор ?? появился в PHP 7.0. Он удобен для отсутствующего ключа, но не подтверждает, что page действительно содержит допустимое целое число.
PHP 5.6 → 7.0: Новые классы и интерфейсы
Новые классы и интерфейсы доступны только после обновления. Их применение связывают с минимальной версией проекта и отдельной проверкой зависимого расширения.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 5.6 → 7.0: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
<?php
$items = 17;
$boxSize = 6;
echo 'Полных коробок: ', intdiv($items, $boxSize), "\n";
echo 'Остаток: ', $items % $boxSize, "\n";
Ожидаемый результат
Полных коробок: 2
Остаток: 5
intdiv появился в PHP 7.0. Делитель ноль по-прежнему является ошибкой, поэтому входной размер коробки проверяют раньше.
PHP 5.6 → 7.0: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 5.6 → 7.0: Изменения поведения функций
У знакомого имени мог измениться договор: параметры, тип результата, предупреждение или исключение. Проверяют фактические входы проекта и добавляют тест на старое граничное значение.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ядро PHP
debug_zval_dump() теперь печатает "int" вместо "long", и "float" вместо "double"
dirname() принимает второй, необязательный, параметр
depth, для получения имени директории наdepthуровней выше текущей.getrusage() теперь поддерживается в Windows.
Функции mktime() и gmmktime() больше не принимают параметр
is_dst.Функция preg_replace() больше не поддерживает "\e" (
PREG_REPLACE_EVAL). Вместо этого используйте preg_replace_callback().Функция setlocale() больше не принимает параметр
categoryпереданный в виде строки. Теперь нужно использовать константыLC_*.Функции exec(), system() и passthru() теперь защищены от NULL-байта.
shmop_open() теперь возвращает не целое, а ресурс, который должен быть передан в shmop_size(), shmop_write(), shmop_read(), shmop_close() и shmop_delete().
substr() и iconv_substr() возвращают пустую строку, если start равно длине строки.
Использование xml_parser_free() теперь недостаточно для освобождения ресурса парсера, если он ссылается на объект, а этот объект ссылается на ресурс парсера. В таком случае необходимо дополнительно вручную удалить (unset) переменную $parser.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP Core
debug_zval_dump() now prints "int" instead of "long", and "float" instead of "double"
dirname() now optionally takes a second parameter,
depth, to get the name of the directorydepthlevels up from the current directory.getrusage() is now supported on Windows.
mktime() and gmmktime() functions no longer accept
is_dstparameter.preg_replace() function no longer supports "\e" (
PREG_REPLACE_EVAL). preg_replace_callback() should be used instead.setlocale() function no longer accepts
categorypassed as string.LC_*constants must be used instead.exec(), system() and passthru() functions have NULL byte protection now.
shmop_open() now returns a resource instead of an int, which has to be passed to shmop_size(), shmop_write(), shmop_read(), shmop_close() and shmop_delete().
substr() and iconv_substr() now return an empty string, if string is equal to start characters long.
xml_parser_free() is no longer sufficient to free the parser resource, if it references an object and this object references that parser resource. In this case it is necessary to additionally unset the $parser.
PHP 5.6 → 7.0: Обратно несовместимые изменения
Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.
Полный официальный договор страницы — большой справочник, раскрывается по запросу
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Изменения в обработке ошибок и исключений
В PHP 7 многие фатальные и поправимые фатальные ошибки переделали в исключения. Эти исключения наследуют класс Error, который, в свою очередь, реализует интерфейс Throwable (новый базовый интерфейс, который наследуют исключения).
Поэтому пользовательские обработчики ошибок не вызовутся, если вместо вызова ошибки выбросится исключение (порождая новые фатальные ошибки из-за неперехваченных исключений класса Error).
Более подробное описание работы ошибок в PHP 7 даёт страница ошибки PHP 7. Это руководство только перечисляет изменения, которые приводят к обратной несовместимости.
Функция set_exception_handler() больше не гарантирует получение объекта класса Exception
Код, который реализует регистрацию обработчика исключений функцией set_exception_handler() через декларацию типа Exception вызовет фатальную ошибку, если выбросится исключение Error.
Потребуется убрать объявление класса из обработчика, если требуется работа обработчика в PHP 5 и 7. Достаточно изменить тип Exception на тип Throwable, если код планируется использовать только в PHP 7.
<?php
// Только PHP 5. В PHP 7 при исключении другого типа вызывает фатальную ошибку
function handler(Exception $e) { /* ... */ }
set_exception_handler('handler');
// Будет работать PHP 5 и 7
function handler($e) { /* ... */ }
// Только PHP 7
function handler(Throwable $e) { /* ... */ }
?>Встроенные конструкторы вызывают исключения при ошибке
Раньше отдельные внутренние классы возвращали
null или бесполезный объект, когда конструктор терпел неудачу.
Теперь встроенные классы в таких случаях выбрасывают
исключение Exception,
так же, как это уже делают пользовательские классы.
Ошибки разбора бросают исключение класса ParseError
Ошибки разбора бросают исключение класса ParseError.
Обработка ошибок eval() должна
включать в себя блок catch, который будет ловить эту ошибку.
Изменение строгости уведомлений E_STRICT
Сообщения уровня E_STRICT
переквалифицировали по другим уровням.
Константу E_STRICT сохранили, поэтому
установка error_reporting(E_ALL|E_STRICT) не вызовет
ошибок.
| Ситуация | Новый уровень или поведение |
|---|---|
| Установка ресурса как индекса | E_NOTICE |
| Абстрактные статические методы | Сообщение убрали, ошибка не возникает |
| «Переопределение» конструктора | Сообщение убрали, ошибка не возникает |
| Несоблюдение сигнатуры при наследовании | E_WARNING |
| Одинаковые (совместимые) свойства в двух разных трейтах | Сообщение убрали, ошибка не возникает |
| Нестатический доступ к статическому свойству | E_NOTICE |
| Только переменные присваиваются по ссылке | E_NOTICE |
| Только переменные передаются по ссылке | E_NOTICE |
| Вызов нестатического метода статически | E_DEPRECATED |
Изменения в обработке переменных
PHP 7 использует абстрактное синтаксическое дерево при разборе файлов с исходным кодом. Это позволило внести множество улучшений в язык, которые ранее были невозможны из-за ограничений парсера, использовавшегося в предыдущих версиях PHP, но привело к удалению некоторых особых возможностей по соображениям согласованности и нарушило обратную совместимость. Описание этих особых случаев приведено в этой секции.
Изменения в обработке непрямых переменных, свойств и методов
Непрямой доступ к переменным, свойствам и методам теперь раскрывается строго слева-направо, в противовес предыдущему сочетанию из специальных правил. В таблице представлены изменения в порядке раскрытия.
| Выражение | Интерпретация PHP 5 | Интерпретация PHP 7 |
|---|---|---|
$$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] |
$foo->$bar['baz'] | $foo->{$bar['baz']} | ($foo->$bar)['baz'] |
$foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
Foo::$bar['baz']() | Foo::{$bar['baz']}() | (Foo::$bar)['baz']() |
Код, использующий старый порядок раскрытия справа-налево, должен быть переписан с использованием фигурных скобок (смотрите средний столбец в таблице выше). Это сделает код рабочим как в PHP 5.x, так и в PHP 7.x.
Также это относится и к ключевому слову global. Для эмуляции старого
поведения необходимо использовать фигурные скобки:
<?php
function f() {
// Корректно только в PHP 5.
global $$foo->bar;
// Корректно в PHP 5 и 7.
global ${$foo->bar};
}
?>Изменение в обработке list()
list() больше не присваивает переменные в обратном порядке
Теперь list() присваивает переменные в
том порядке, как они перечислены, а не в обратном. В целом,
это влияет только на случаи, когда list()
используется совместно с оператором массива
[], как показано ниже:
<?php
list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);
?>Результат выполнения приведённого примера в PHP 5:
array(3) {
[0]=>
int(3)
[1]=>
int(2)
[2]=>
int(1)
}
Результат выполнения приведённого примера в PHP 7:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
Также хочется отметить, что полагаться на порядок присвоения оператором list() - не самое разумное решение, поскольку он снова может поменяться в будущем.
Пустое присвоение list() больше не разрешено
Конструкция list() больше не может быть пустой. Следующие примеры недопустимы:
<?php
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
?>list() не может раскрывать строки
list() более не может раскрывать строки. Используйте str_split().
Изменён порядок массива при автоматическом создании через присвоение по ссылке
Порядок создания элементов в массиве был изменён, когда элемент создаётся путём присвоения значения переменной, на которую ссылается этот элемент. Пример:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>Результат выполнения приведённого примера в PHP 5:
array(2) {
["b"]=>
&int(1)
["a"]=>
&int(1)
}
Результат выполнения приведённого примера в PHP 7:
array(2) {
["a"]=>
&int(1)
["b"]=>
&int(1)
}
Скобки вокруг аргументов функции больше ни на что не влияют
В PHP 5 при использовании избыточных скобок вокруг аргументов функции не выводилось предупреждение, когда аргумент передавался по ссылке. Теперь предупреждение выводится всегда.
<?php
function getArray() {
return [1, 2, 3];
}
function squareArray(array &$a) {
foreach ($a as &$v) {
$v **= 2;
}
}
// Выведет предупреждение в PHP 7.
squareArray((getArray()));
?>Результат выполнения приведённого примера:
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
Изменения foreach
Небольшие изменения были внесены в поведение
управляющей структуры foreach. Основное изменение
касается модификации итерируемого массива и обработки его
внутреннего указателя.
foreach больше не изменяет внутренний указатель массива
До PHP 7 в процессе итерации массива в foreach, его
внутренний указатель изменялся. В примере ниже
показано, что это поведение изменено:
<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
?>Результат выполнения приведённого примера в PHP 5:
int(1) int(2) bool(false)
Результат выполнения приведённого примера в PHP 7:
int(0) int(0) int(0)
foreach по значениям оперирует копией массива
Если foreach используется для стандартного перебора
по значению, то он оперирует копией массива, а не самим
массивом. Это значит, что изменения внесённые в массив
внутри цикла не затронут перебираемые значения.
Для foreach по ссылке улучшили поведение при итерации
Когда foreach используется для перебора по ссылке,
он будет лучше отслеживать изменения, вносимые в массив
в процессе итерации. К примеру, добавление элементов к
итерируемому массиву приведёт к тому, что эти новые
элементы попадут в перебор:
<?php
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
?>Результат выполнения приведённого примера в PHP 5:
int(0)
Результат выполнения приведённого примера в PHP 7:
int(0) int(1)
Итерация объектов не реализующих Traversable
Итерация объектов не реализующих Traversable теперь происходит так же, как и итерация массива по ссылке. Так получается вследствие того, что улучшения поведения при изменении массива во время итерации также влияет при добавлении или удалении свойств объекта.
Изменение в обработке значений типа int
Некорректная восьмеричная нотация
Ранее восьмеричные литералы, содержащие некорректные числа молча
обрезались (0128 считались за 012).
Сейчас в таких случаях будет выдана ошибка разбора.
Отрицательные побитовые смещения
Теперь побитовые смещения на отрицательную величину будут бросать исключение ArithmeticError:
<?php
var_dump(1 >> -1);
?>Результат выполнения приведённого примера в PHP 5:
int(0)
Результат выполнения приведённого примера в PHP 7:
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
thrown in /tmp/test.php on line 2
Побитовые смещения с выходом из допустимого диапазона
Побитовые смещения (в обоих направлениях) за пределы ширины типа int будут всегда возвращать 0. Раньше поведение зависело от архитектуры.
Изменение в делении на ноль
Ранее использование нуля в качестве делителя в операциях
деления (/) или деления по модулю (%) приводило к ошибке уровня
E_WARNING и возврату значения false.
Теперь оператор деления возвращает число с плавающей точкой, равное
+INF, -INF или NAN, как определено в IEEE 754. Деление по модулю вместо
ошибки уровня E_WARNING будет выбрасывать исключение
DivisionByZeroError.
<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>Результат выполнения приведённого примера в PHP 5:
Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false)
Результат выполнения приведённого примера в PHP 7:
Warning: Division by zero in %s on line %d float(INF) Warning: Division by zero in %s on line %d float(NAN) PHP Fatal error: Uncaught DivisionByZeroError: Modulo by zero in %s line %d
Изменения в обработке строк
Шестнадцатеричные строки больше не считаются за числовые
Строки, содержащие шестнадцатеричные символы больше не считаются за числовые. Пример:
<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
?>Результат выполнения приведённого примера в PHP 5:
bool(true) bool(true) int(15) string(2) "oo"
Результат выполнения приведённого примера в PHP 7:
bool(false) bool(false) int(0) Notice: A non well formed numeric value encountered in /tmp/test.php on line 5 string(3) "foo"
Используйте функцию filter_var() для проверки строки на содержание шестнадцатеричного числа и преобразования этой строки к значению типа int:
<?php
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
throw new Exception("Некорректное целое число!");
}
var_dump($int); // int(65535)
?>\u{ может вызывать ошибки
В связи с добавлением нового
синтаксиса экранирования кодов Unicode,
строки, содержащие строку \u{, предваряющую некорректную
последовательность, может привести к фатальной ошибке.
Для того, чтобы этого избежать, необходимо экранировать первый обратный слеш.
Удалённые функции
Функции call_user_method() и call_user_method_array()
Эти функции устарели в PHP 4.1.0 в пользу
функций call_user_func()
и call_user_func_array(). Обратите внимание
на функции переменных
и (или) оператор
....
Семейство функций ereg*
Функции ereg удалили.
Рекомендованная альтернатива — Perl-совместимые регулярные выражения PCRE.
Псевдонимы модуля mcrypt
Устаревшую функцию mcrypt_generic_end() удалили в пользу функции mcrypt_generic_deinit().
Кроме этого, устаревшие функции mcrypt_ecb(),
mcrypt_cbc(), mcrypt_cfb()
и mcrypt_ofb() удалили в пользу
функции mcrypt_decrypt()
с соответствующей константой
MCRYPT_MODE_*.
Функции модуля mysql
Все функции модуля ext/mysql удалили. Подробнее о выборе другого API-интерфейса к СУБД MySQL рассказывает раздел «Выбор MySQL API».
Псевдонимы модуля intl
Устаревшие псевдонимы datefmt_set_timezone_id() и IntlDateFormatter::setTimeZoneID() удалили в пользу функции datefmt_set_timezone() и метода IntlDateFormatter::setTimeZone().
set_magic_quotes_runtime()
Функцию set_magic_quotes_runtime() и её псевдоним magic_quotes_runtime() удалили. Функции объявили устаревшими в PHP 5.3.0, поскольку они потеряли смысл с отказом от магических кавычек в PHP 5.4.0.
set_socket_blocking()
Устаревший псевдоним set_socket_blocking() удалили в пользу функции stream_set_blocking().
Функция dl() в менеджере процессов PHP-FPM
Функцию dl() больше нельзя использовать в PHP-FPM. Однако функцию оставили в CLI-интерфейсе и встроенных интерфейсах SAPI.
Функции модуля GD Type1
Поддержку шрифтов PostScript Type1 удалили из модуля GD. Соответственно удалили следующие функции:
imagepsbbox()
imagepsencodefont()
imagepsextendfont()
imagepsfreefont()
imagepsloadfont()
imagepsslantfont()
imagepstext()
Вместо удалённых функций рекомендуется использовать шрифты TrueType и функции, которые с ними связаны.
Удалённые директивы INI-файла
Удалённые возможности
Следующие INI-директивы были удалены, так как связанные с ними функции также были удалены:
always_populate_raw_post_dataasp_tags
xsl.security_prefs
Директива xsl.security_prefs была удалена.
Вместо неё для контроля настроек безопасности должен вызываться метод
XsltProcessor::setSecurityPrefs()
на уровне каждого процессора.
Прочие изменения, которые затрагивают обратную совместимость
Новые объекты нельзя присваивать по ссылке
Результат оператора new больше нельзя присваивать
переменной по ссылке:
<?php
class C {}
$c =& new C;
?>Результат выполнения приведённого примера в PHP 5:
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
Результат выполнения приведённого примера в PHP 7:
Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3
Некорректные имена классов, интерфейсов и трейтов
Следующие имена нельзя использовать для классов, интерфейсов и трейтов:
Дополнительно к предыдущим именам, следующие имена тоже нельзя использовать. Следующие имена не вызовут ошибку в PHP 7.0, но их зарезервировали на будущее, а от разработчиков требуют считать их устаревшими.
Удалили PHP-теги ASP и script
Удалили поддержку тегов ASP и script для определения PHP-кода.
| Открывающий тег | Закрывающий тег |
|---|---|
<% | %> |
<%= | %> |
<script language="php"> | </script> |
Удалили вызовы из неподходящего контекста
Статические вызовы нестатических методов из неподходящего
контекста,
которые признали устаревшими в PHP 5.6
,
теперь оставят переменную $this неопределённой
для вызываемого метода и выведут предупреждение.
<?php
class A
{
public function test()
{
var_dump($this);
}
}
// Обратите внимание: класс B не расширяет класс A
class B
{
public function callNonStaticMethodOfA()
{
A::test();
}
}
(new B())
->callNonStaticMethodOfA()
;
?>Результат выполнения приведённого примера в PHP 5.6:
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
Результат выполнения приведённого примера в PHP 7:
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8 Notice: Undefined variable: this in /tmp/test.php on line 3 NULL
Ключевое слово yield теперь право-ассоциативный оператор
Конструкция yield больше не требует скобок
и изменилась на право-ассоциативный оператор с приоритетом
между языковой конструкцией print и оператором =>.
Иногда это изменяет поведение кода:
<?php
echo yield -1;
// Раньше интерпретировалось так
echo (yield) - 1;
// А теперь так
echo yield (-1);
yield $foo or die;
// Раньше интерпретировалось так
yield ($foo or die);
// А теперь так
(yield $foo) or die;
?>Устранять неоднозначности помогают скобки.
В функциях нельзя определять параметры с одинаковыми именами
Больше нельзя определить в функции параметры
с одинаковыми именами. Следующая функция выдаст
ошибку уровня E_COMPILE_ERROR:
<?php
function foo($a, $b, $unused, $unused)
{
//
}
?>Функции, которые работают с аргументами, теперь возвращают текущие значения аргументов
Функции func_get_arg(), func_get_args(), debug_backtrace() и трассировки исключений возвращают не исходные значения параметров, которые передали в функции в аргументах, а текущие значения параметров, которые к моменту возврата могли изменить значение.
<?php
function foo($x)
{
$x++;
var_dump(func_get_arg(0));
}
foo(1);
?>Результат выполнения приведённого примера в PHP 5:
1
Результат выполнения приведённого примера в PHP 7:
2
Для оператора switch больше нельзя указывать больше одного блока default
В операторе switch больше невозможно задать больше одного
блока default. Например, такая конструкция выдаст
ошибку E_COMPILE_ERROR:
<?php
switch (1) {
default:
break;
default:
break;
}
?>Удалили элемент суперглобального массива $HTTP_RAW_POST_DATA
Переменная $HTTP_RAW_POST_DATA больше недоступна. Вместо неё
пользуются потоком php://input.
В INI-файлах запретили комментарии,
которые начинались с символа #
Поддержку префикса комментария #
в INI-файлах удалили. Вместо него пользуются префиксом ;.
Это изменение касается как файла php.ini, так и файлов,
которые обрабатываются функциями
parse_ini_file()
и parse_ini_string().
Модуль JSON заменили на JSOND
Модуль JSON заменили на JSOND, что порождает три
небольших обратных несовместимости. Первое — числа
нельзя заканчивать точкой, значения наподобие 34.
требуется заменить на 34.0 или 34.
Второе — в научной нотации экспоненте e нельзя следовать
сразу за десятичной точкой, значения наподобие 3.e3
требуется заменить на 3.0e3 или 3e3.
Третье — модуль не считает пустую строку корректным JSON-форматом.
Ошибки внутренних функций при переполнении
Раньше встроенные функции иногда без предупреждения обрезали числа,
которые получили при приведении значений с типом float к значениям с типом integer,
если float-значение оказывалось больше, чем вмещает integer. Теперь функции
выдадут ошибку уровня E_WARNING и вернут null.
Исправление для значений, которые возвращает пользовательский обработчик сессии
Предикатные функции, которые реализовали через
пользовательские обработчики сессии и которые возвращают
значения false или -1, вызовут фатальную ошибку.
Значения вызовут сбой и ошибку уровня E_WARNING, если из этих функций вернётся значение,
которое отличается от логического, -1 или 0.
Порядок сортировки одинаковых элементов
Внутренний алгоритм сортировки улучшили. Изменение алгоритма иногда упорядочивает одинаковые элементы не так, как алгоритм делал это прежде.
Замечание:
Не полагайтесь на порядок одинаковых элементов, так как он изменится в любое время.
Изменение порядка обработки операторов break и continue
Операторы break и continue за пределами цикла
или управляющей структуры switch теперь обрабатываются во время
компиляции, а не во время выполнения, как это было раньше, поэтому выдают ошибки
уровня E_COMPILE_ERROR.
Запретили константы как аргументы инструкций break и continue
Инструкции break и continue больше
не принимают константу как аргумент и вызывают ошибку
уровня E_COMPILE_ERROR.
Mhash больше не модуль
Модуль Mhash полностью интегрировали в модуль Hash. Поэтому больше невозможно определить доступность модуля Mhash функцией extension_loaded(); вместо неё пользуются функцией function_exists(). Кроме того, функция get_loaded_extensions() и функции, которые с ней связаны, больше не сообщают о модуле Mhash.
declare(ticks)
Директива declare(ticks) больше не проникает в отдельные единицы компиляции.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Changes to error and exception handling
Many fatal and recoverable fatal errors have been converted to exceptions in PHP 7. These error exceptions inherit from the Error class, which itself implements the Throwable interface (the new base interface all exceptions inherit).
This means that custom error handlers may no longer be triggered because exceptions may be thrown instead (causing new fatal errors for uncaught Error exceptions).
A more complete description of how errors operate in PHP can be found on the Throwable errors page. This migration guide will merely enumerate the changes that affect backward compatibility.
set_exception_handler() is no longer guaranteed to receive Exception objects
Code that implements an exception handler registered with set_exception_handler() using a type declaration of Exception will cause a fatal error when an Error object is thrown.
If the handler needs to work on both PHP 5 and 7, you should remove the type declaration from the handler, while code that is being migrated to work on PHP 7 exclusively can simply replace the Exception type declaration with Throwable instead.
<?php
// PHP 5 era code that will break.
function handler(Exception $e) { /* ... */ }
set_exception_handler('handler');
// PHP 5 and 7 compatible.
function handler($e) { /* ... */ }
// PHP 7 only.
function handler(Throwable $e) { /* ... */ }
?>Internal constructors always throw exceptions on failure
Previously, some internal classes would return null or an unusable object
when the constructor failed. All internal classes will now throw an
Exception in this case in the same way that user
classes already had to.
Parse errors throw ParseError
Parser errors now throw a ParseError object. Error
handling for eval() should now include a catch block
that can handle this error.
E_STRICT notices severity changes
All of the E_STRICT notices have been reclassified to
other levels. E_STRICT constant is retained, so calls like
error_reporting(E_ALL|E_STRICT) will not cause an error.
| Situation | New level/behaviour |
|---|---|
| Indexing by a resource | E_NOTICE |
| Abstract static methods | Notice removed, triggers no error |
| "Redefining" a constructor | Notice removed, triggers no error |
| Signature mismatch during inheritance | E_WARNING |
| Same (compatible) property in two used traits | Notice removed, triggers no error |
| Accessing static property non-statically | E_NOTICE |
| Only variables should be assigned by reference | E_NOTICE |
| Only variables should be passed by reference | E_NOTICE |
| Calling non-static methods statically | E_DEPRECATED |
Changes to variable handling
PHP 7 now uses an abstract syntax tree when parsing source files. This has permitted many improvements to the language which were previously impossible due to limitations in the parser used in earlier versions of PHP, but has resulted in the removal of a few special cases for consistency reasons, which has resulted in backward compatibility breaks. These cases are detailed in this section.
Changes to the handling of indirect variables, properties, and methods
Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluation has changed.
| Expression | PHP 5 interpretation | PHP 7 interpretation |
|---|---|---|
$$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] |
$foo->$bar['baz'] | $foo->{$bar['baz']} | ($foo->$bar)['baz'] |
$foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
Foo::$bar['baz']() | Foo::{$bar['baz']}() | (Foo::$bar)['baz']() |
Code that used the old right-to-left evaluation order must be rewritten to explicitly use that evaluation order with curly braces (see the above middle column). This will make the code both forwards compatible with PHP 7.x and backwards compatible with PHP 5.x.
This also affects the global keyword. The curly brace syntax can be
used to emulate the previous behaviour if required:
<?php
function f() {
// Valid in PHP 5 only.
global $$foo->bar;
// Valid in PHP 5 and 7.
global ${$foo->bar};
}
?>Changes to list() handling
list() no longer assigns variables in reverse order
list() will now assign values to variables in the
order they are defined, rather than reverse order. In general, this only
affects the case where list() is being used in
conjunction with the array [] operator, as shown below:
<?php
list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);
?>Output of the above example in PHP 5:
array(3) {
[0]=>
int(3)
[1]=>
int(2)
[2]=>
int(1)
}
Output of the above example in PHP 7:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
In general, it is recommended not to rely on the order in which list() assignments occur, as this is an implementation detail that may change again in the future.
Array ordering when elements are automatically created during by reference assignments has changed
The order of the elements in an array has changed when those elements have been automatically created by referencing them in a by reference assignment. For example:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>Output of the above example in PHP 5:
array(2) {
["b"]=>
&int(1)
["a"]=>
&int(1)
}
Output of the above example in PHP 7:
array(2) {
["a"]=>
&int(1)
["b"]=>
&int(1)
}
Parentheses around function arguments no longer affect behaviour
In PHP 5, using redundant parentheses around a function argument could quiet strict standards warnings when the function argument was passed by reference. The warning will now always be issued.
<?php
function getArray() {
return [1, 2, 3];
}
function squareArray(array &$a) {
foreach ($a as &$v) {
$v **= 2;
}
}
// Generates a warning in PHP 7.
squareArray((getArray()));
?>The above example will output:
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
Changes to foreach
Minor changes have been made to the behaviour of the foreach control
structure, primarily around the handling of the internal array pointer and
modification of the array being iterated over.
foreach no longer changes the internal array pointer
Prior to PHP 7, the internal array pointer was modified while an array was
being iterated over with foreach. This is no longer the case, as shown
in the following example:
<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
?>Output of the above example in PHP 5:
int(1) int(2) bool(false)
Output of the above example in PHP 7:
int(0) int(0) int(0)
foreach by-value operates on a copy of the array
When used in the default by-value mode, foreach will now operate on a
copy of the array being iterated rather than the array itself. This means
that changes to the array made during iteration will not affect the values
that are iterated.
foreach by-reference has improved iteration behaviour
When iterating by-reference, foreach will now do a better job of
tracking changes to the array made during iteration. For example,
appending to an array while iterating will now result in the appended
values being iterated over as well:
<?php
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
?>Output of the above example in PHP 5:
int(0)
Output of the above example in PHP 7:
int(0) int(1)
Iteration of non-Traversable objects
Iterating over a non-Traversable object will now have the same behaviour as iterating over by-reference arrays. This results in the improved behaviour when modifying an array during iteration also being applied when properties are added to or removed from the object.
Changes to int handling
Invalid octal literals
Previously, octal literals that contained invalid numbers were silently
truncated (0128 was taken as 012).
Now, an invalid octal literal will cause a parse error.
Negative bitshifts
Bitwise shifts by negative numbers will now throw an ArithmeticError:
<?php
var_dump(1 >> -1);
?>Output of the above example in PHP 5:
int(0)
Output of the above example in PHP 7:
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
thrown in /tmp/test.php on line 2
Out of range bitshifts
Bitwise shifts (in either direction) beyond the bit width of an int will always result in 0. Previously, the behaviour of such shifts was architecture dependent.
Changes to Division By Zero
Previously, when 0 was used as the divisor for either the divide (/) or
modulus (%) operators, an E_WARNING would be emitted and
false would be returned. Now, the divide operator
returns a float as either +INF, -INF, or NAN, as specified by IEEE 754. The modulus operator E_WARNING
has been removed and will throw a DivisionByZeroError
exception.
<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>Output of the above example in PHP 5:
Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false)
Output of the above example in PHP 7:
Warning: Division by zero in %s on line %d float(INF) Warning: Division by zero in %s on line %d float(NAN) PHP Fatal error: Uncaught DivisionByZeroError: Modulo by zero in %s line %d
Changes to string handling
Hexadecimal strings are no longer considered numeric
Strings containing hexadecimal numbers are no longer considered to be numeric. For example:
<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
?>Output of the above example in PHP 5:
bool(true) bool(true) int(15) string(2) "oo"
Output of the above example in PHP 7:
bool(false) bool(false) int(0) Notice: A non well formed numeric value encountered in /tmp/test.php on line 5 string(3) "foo"
filter_var() can be used to check if a string contains a hexadecimal number, and also to convert a string of that type to an int:
<?php
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)
?>\u{ may cause errors
Due to the addition of the new
Unicode codepoint escape syntax,
strings containing a literal \u{ followed by an invalid
sequence will cause a fatal error. To avoid this, the leading backslash
should be escaped.
Removed functions
call_user_method() and call_user_method_array()
These functions were deprecated in PHP 4.1.0 in favour of
call_user_func() and
call_user_func_array(). You may also want to consider
using
variable functions
and/or the
...
operator.
All ereg* functions
All ereg functions were removed.
PCRE is a recommended alternative.
mcrypt aliases
The deprecated mcrypt_generic_end() function has been removed in favour of mcrypt_generic_deinit().
Additionally, the deprecated mcrypt_ecb(),
mcrypt_cbc(), mcrypt_cfb() and
mcrypt_ofb() functions have been removed in favour of
using mcrypt_decrypt() with the appropriate
MCRYPT_MODE_* constant.
All ext/mysql functions
All ext/mysql functions were removed. For details about choosing a different MySQL API, see Choosing a MySQL API.
All ext/mssql functions
All ext/mssql functions were removed.
intl aliases
The deprecated datefmt_set_timezone_id() and IntlDateFormatter::setTimeZoneID() aliases have been removed in favour of datefmt_set_timezone() and IntlDateFormatter::setTimeZone(), respectively.
set_magic_quotes_runtime()
set_magic_quotes_runtime(), along with its alias magic_quotes_runtime(), have been removed. They were deprecated in PHP 5.3.0, and became effectively non-functional with the removal of magic quotes in PHP 5.4.0.
set_socket_blocking()
The deprecated set_socket_blocking() alias has been removed in favour of stream_set_blocking().
dl() in PHP-FPM
dl() can no longer be used in PHP-FPM. It remains functional in the CLI and embed SAPIs.
GD Type1 functions
Support for PostScript Type1 fonts has been removed from the GD extension, resulting in the removal of the following functions:
imagepsbbox()
imagepsencodefont()
imagepsextendfont()
imagepsfreefont()
imagepsloadfont()
imagepsslantfont()
imagepstext()
Using TrueType fonts and their associated functions is recommended instead.
Removed INI directives
Removed features
The following INI directives have been removed as their associated features have also been removed:
always_populate_raw_post_dataasp_tags
xsl.security_prefs
The xsl.security_prefs directive has been removed.
Instead, the XsltProcessor::setSecurityPrefs()
method should be called to control the security preferences on a
per-processor basis.
Other backward incompatible changes
New objects cannot be assigned by reference
The result of the new statement can no longer be assigned to a variable
by reference:
<?php
class C {}
$c =& new C;
?>Output of the above example in PHP 5:
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
Output of the above example in PHP 7:
Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3
Invalid class, interface and trait names
The following names cannot be used to name classes, interfaces or traits:
Furthermore, the following names should not be used. Although they will not generate an error in PHP 7.0, they are reserved for future use and should be considered deprecated.
ASP and script PHP tags removed
Support for using ASP and script tags to delimit PHP code has been removed. The affected tags are:
| Opening tag | Closing tag |
|---|---|
<% | %> |
<%= | %> |
<script language="php"> | </script> |
Calls from incompatible context removed
Previously deprecated in PHP 5.6,
static calls made to a non-static method with an incompatible context will
now result in the called method having an undefined
$this variable and a deprecation warning being issued.
<?php
class A {
public function test() { var_dump($this); }
}
// Note: Does NOT extend A
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();
?>Output of the above example in PHP 5.6:
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
Output of the above example in PHP 7:
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8 Notice: Undefined variable: this in /tmp/test.php on line 3 NULL
yield is now a right associative operator
The yield construct no longer requires parentheses, and has been changed
to a right associative operator with precedence between
print and =>. This can result in
changed behaviour:
<?php
echo yield -1;
// Was previously interpreted as
echo (yield) - 1;
// And is now interpreted as
echo yield (-1);
yield $foo or die;
// Was previously interpreted as
yield ($foo or die);
// And is now interpreted as
(yield $foo) or die;
?>Parentheses can be used to disambiguate those cases.
Functions cannot have multiple parameters with the same name
It is no longer possible to define two or more function parameters with the
same name. For example, the following function will trigger an
E_COMPILE_ERROR:
<?php
function foo($a, $b, $unused, $unused) {
//
}
?>Functions inspecting arguments report the current parameter value
func_get_arg(), func_get_args(), debug_backtrace() and exception backtraces will no longer report the original value that was passed to a parameter, but will instead provide the current value (which might have been modified).
<?php
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);?>Output of the above example in PHP 5:
1
Output of the above example in PHP 7:
2
Switch statements cannot have multiple default blocks
It is no longer possible to define two or more default blocks in a switch
statement. For example, the following switch statement will trigger an
E_COMPILE_ERROR:
<?php
switch (1) {
default:
break;
default:
break;
}
?>$HTTP_RAW_POST_DATA removed
$HTTP_RAW_POST_DATA is no longer available. The
php://input
stream should be used instead.
# comments in INI files removed
Support for prefixing comments with # in INI files has been
removed. ; (semi-colon) should be used instead. This change
applies to php.ini, as well as files handled by
parse_ini_file() and parse_ini_string().
JSON extension replaced with JSOND
The JSON extension has been replaced with JSOND, causing three minor BC
breaks. Firstly, a number must not end in a decimal point (i.e.
34. must be changed to either 34.0 or
34). Secondly, when using scientific notation, the
e exponent must not immediately follow a decimal point
(i.e. 3.e3 must be changed to either
3.0e3 or 3e3).
Finally, an empty string is no longer considered valid JSON.
Internal function failure on overflow
Previously, internal functions would silently truncate numbers produced from
float-to-integer coercions when the float was too large to represent as an
integer. Now, an E_WARNING will be emitted and null will be returned.
Fixes to custom session handler return values
Any predicate functions implemented by custom session handlers that return
either false or -1 will be fatal errors. If any value
from these functions other than a boolean, -1, or
0 is returned, then it will fail and an E_WARNING will be
emitted.
Sort order of equal elements
The internal sorting algorithm has been improved, what may result in different sort order of elements, which compare as equal, than before.
Note:
Don't rely on the order of elements which compare as equal; it might change anytime.
Misplaced break and continue statements
break and continue statements outside of
a loop or switch control structure are now detected at
compile-time instead of run-time as before, and trigger an
E_COMPILE_ERROR.
Constant disallowed as break and continue argument
break and continue statements no longer
allow their argument to be a constant, and trigger a
E_COMPILE_ERROR.
Mhash is not an extension anymore
The Mhash extension has been fully integrated into the Hash extension. Therefore, it is no longer possible to detect Mhash support with extension_loaded(); use function_exists() instead. Furthermore, Mhash is no longer reported by get_loaded_extensions() and related features.
declare(ticks)
The declare(ticks) directive does no longer leak into different compilation units.
PHP 5.6 → 7.0: Устаревшие возможности
Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Конструкторы в стиле PHP 4
Конструкторы в стиле PHP 4 (методы с тем же именем, что и сам класс) объявлены
устаревшими и будут удалены в будущем. В PHP 7 будет выдаваться предупреждение
E_DEPRECATED в случае использования таких конструкторов. Классы,
реализующие метод __construct(), затронуты не будут.
<?php
class foo {
function foo() {
echo 'Я конструктор!';
}
}
?>Результат выполнения приведённого примера:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3
Статические вызовы нестатических методов
Статические вызовы методов, не определённых как static, объявлены устаревшими и могут быть в будущем запрещены.
<?php
class foo {
function bar() {
echo 'Я не статический!';
}
}
foo::bar();
?>Результат выполнения приведённого примера:
Deprecated: Non-static method foo::bar() should not be called statically in - on line 8 Я не статический!
Опция salt функции password_hash()
Опция salt функции password_hash() была объявлена устаревшей для предотвращения использования разработчиками своих собственных salt (зачастую небезопасных). Функция самостоятельно генерирует криптографически безопасный salt, если он не задан разработчиком, следовательно больше нет нужды в пользовательских генераторах salt.
Опция контекста SSL capture_session_meta
Опция контекста SSL capture_session_meta объявлена устаревшей.
Метаданные SSL теперь доступны с помощью функции
stream_get_meta_data().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 4 style constructors
PHP 4 style constructors (methods that have the same name as the class they
are defined in) are deprecated, and will be removed in the future. PHP 7
will emit E_DEPRECATED if a PHP 4 constructor is the
only constructor defined within a class. Classes that implement a
__construct() method are unaffected.
<?php
class foo {
function foo() {
echo 'I am the constructor';
}
}
?>The above example will output:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3
Static calls to non-static methods
Static calls to methods that are not declared static are deprecated, and may be removed in the future.
<?php
class foo {
function bar() {
echo 'I am not static!';
}
}
foo::bar();
?>The above example will output:
Deprecated: Non-static method foo::bar() should not be called statically in - on line 8 I am not static!
password_hash() salt option
The salt option for the password_hash() function has been deprecated to prevent developers from generating their own (usually insecure) salts. The function itself generates a cryptographically secure salt when no salt is provided by the developer - therefore custom salt generation should not be needed.
capture_session_meta SSL context option
The capture_session_meta SSL context option has been
deprecated. SSL metadata is now available through the
stream_get_meta_data() function.
PHP 5.6 → 7.0: Удалённые расширения и SAPI
Удалённые расширения и SAPI затрагивают и код, и способ запуска PHP. Инвентаризация должна включать пакеты ОС, конфигурацию веб-сервера и команды обслуживания.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Удалённые модули
ereg
mssql
mysql
sybase_ct
Удалённые SAPI
aolserver
apache
apache_hooks
apache2filter
caudium
continuity
isapi
milter
nsapi
phttpd
pi3web
roxen
thttpd
tux
webjames
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Removed Extensions
ereg
mssql
mysql
sybase_ct
Removed SAPIs
aolserver
apache
apache_hooks
apache2filter
caudium
continuity
isapi
milter
nsapi
phttpd
pi3web
roxen
thttpd
tux
webjames
PHP 5.6 → 7.0: Изменения SAPI
SAPI определяет, как PHP получает запрос и конфигурацию. Изменение проверяют отдельно для CLI, FPM, Apache или другого реально используемого режима.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
FPM
Не полностью определённый порт listen теперь слушает как IPv4, так и IPv6
В PHP 5 директива listen содержащая только номер порта, приводила к прослушиванию всех интерфейсах, но только по IPv4. PHP 7 теперь будет принимать как с IPv4, так и с IPv6.
Это не влияет на директивы, содержащие конкретные IP-адреса.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
FPM
Unqualified listen ports now listen on both IPv4 and IPv6
In PHP 5, a listen directive with only a port number would listen on all interfaces, but only on IPv4. PHP 7 will now accept requests made via both IPv4 and IPv6.
This does not affect directives which include specific IP addresses; these will continue to only listen on that address and protocol.
PHP 5.6 → 7.0: Другие изменения
Сюда попадают изменения поведения, конфигурации и расширений, которые не образуют новую синтаксическую конструкцию. Их сверяют с фактически установленными модулями и рабочими сценариями проекта.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ослабление ограничений на использование зарезервированных слов
Глобально зарезервированные слова теперь разрешено использовать для свойств, констант и методов в классах, интерфейсах и трейтах. Это уменьшает масштабы проблем обратной совместимости при вводе новых ключевых слов и позволяет избежать ограничений для API.
Это особенно полезно при создании внутренних DSL с текучими интерфейсами:
<?php
// Ранее 'new', 'private' и 'for' использовать было нельзя.
Project::new('Project Name')->private()->for('purpose here')->with('username here');
?>
Единственное ограничение, что слово class всё ещё нельзя
использовать как имя константы, так как оно будет пересекаться с синтаксисом
разрешения имени класса (ClassName::class).
Удаление предупреждения date.timezone
Ранее вызывалось предупреждение, если INI-настройка
date.timezone не была задана раньше
использования каких-либо функций работы с датой или временем. Теперь это
предупреждение удалено (но
date.timezone по умолчанию всё ещё UTC).
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Loosening Reserved Word Restrictions
Globally reserved words as property, constant, and method names within classes, interfaces, and traits are now allowed. This reduces the surface of BC breaks when new keywords are introduced and avoids naming restrictions on APIs.
This is particularly useful when creating internal DSLs with fluent interfaces:
<?php
// 'new', 'private', and 'for' were previously unusable
Project::new('Project Name')->private()->for('purpose here')->with('username here');
?>
The only limitation is that the class keyword still
cannot be used as a constant name, otherwise it would conflict with the
class name resolution syntax (ClassName::class).
Removal of date.timezone Warning
Previously, a warning was emitted if the
date.timezone INI setting had not
been set prior to using any date- or time-based functions. Now, this warning
has been removed (with
date.timezone still defaulting to
UTC).
PHP 7.0 → 7.1
Этот узел — контрольная карта перехода PHP 7.0 → 7.1. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Новые возможности
- Новые функции
- Новые глобальные константы
- Изменения, которые ломают обратную совместимость
- Функционал, объявленный устаревшим в PHP 7.1.x
- Изменённые функции
- Другие изменения
- Поддержка Windows
Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных окружениях.
Смотрите также руководство по миграции для версий PHP 7.0.x.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- New features
- New functions
- New global constants
- Backward incompatible changes
- Deprecated features in PHP 7.1.x
- Changed functions
- Other changes
- Windows Support
This new minor version brings with it a number of new features and a few incompatibilities that should be tested for before switching PHP versions in production environments.
See also the migration guides for PHP versions 7.0.x.
PHP 7.0 → 7.1: Новые возможности языка и платформы
Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Обнуляемые типы
Типы параметров и значений возврата функций стали обнуляемыми.
Тип становится обнуляемым, если перед названием типа указали вопросительный знак.
Знак вопроса перед названием типа указывает, что параметр принимает, или функция возвращает,
значение заданного типа или значение null.
<?php
function testReturnA(): ?string
{
return 'elePHPant';
}
var_dump(testReturnA());
function testReturnB(): ?string
{
return null;
}
var_dump(testReturnB());
function test(?string $name)
{
var_dump($name);
}
test('elePHPant');
test(null);
test();
?>Результат выполнения приведённого примера:
string(9) "elePHPant" NULL string(9) "elePHPant" NULL Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in...
Функции без возврата значения
Для значений возврата добавили тип void. В функциях
с типом возврата void потребуется либо пропустить инструкцию return,
либо указать пустую инструкцию return, без значения. Из void-функций
нельзя возвращать значение null.
<?php
function swap(&$left, &$right): void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);
?>Результат выполнения приведённого примера:
null int(2) int(1)
При попытке получить возврат void-функции значение вычисляется как null, без выдачи предупреждения.
Причина такого поведения состоит в том, что предупреждения ограничили бы работу общих функций
высшего порядка с void-функциями.
Симметричная деструктуризация массива
Короткий синтаксис массивов [] теперь доступен для деструктуризации массивов
и присваивания значений, в том числе в циклах foreach.
Короткий синтаксис появился как альтернатива
языковой конструкции list(), которая по-прежнему поддерживается.
<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];
// Деструктуризация массива в стиле языковой конструкции list()
list($id1, $name1) = $data[0];
// Деструктуризация массива в стиле короткого синтаксиса массивов []
[$id1, $name1] = $data[0];
// Деструктуризация через list()
foreach ($data as list($id, $name)) {
// В этом месте применяем логику работы с переменными $id и $name
}
// Деструктуризация через короткий синтаксис []
foreach ($data as [$id, $name]) {
// В этом месте применяем логику работы с переменными $id и $name
}
?>Видимость констант класса
Константы классов теперь поддерживают определение области видимости.
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
?>Псевдотип iterable
Семейство псевдотипов, к которым также относится тип callable, пополнилось новым псевдотипом с названием iterable. Новый псевдотип доступен и как тип параметров, и как тип значений возврата, которые принимают массивы или объекты, которые реализуют интерфейс Traversable. В вопросах подтипирования, типам параметров дочерних классов доступно расширение типа array или Traversable в объявлениях родительского класса до типа iterable. В объявлениях типа возврата дочерним классам разрешается сужать тип возврата родительского метода с iterable до array или Traversable.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}Обработка набора исключений в одном блоке catch
Блоки catch научились обрабатывать набор исключений, которые
указывают через символ вертикальной черты |. Это приносит пользу,
когда исключения разных иерархий классов требуется обрабатывать одинаково.
<?php
try {
// Какой-то код
} catch (FirstException | SecondException $e) {
// Обрабатываем одно или другое исключение
}Поддержка ключей в языковой конструкции list()
Языковая конструкция list() и её новый
короткий синтаксис [] теперь поддерживают ключи.
Это помогает деструктурировать
массивы с нечисловыми или непоследовательными ключами.
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// Деструктуризация массива в стиле языковой конструкции list()
list("id" => $id1, "name" => $name1) = $data[0];
// Деструктуризация массива в стиле короткого синтаксиса массивов []
["id" => $id1, "name" => $name1] = $data[0];
// Деструктуризация в стиле list()
foreach ($data as list("id" => $id, "name" => $name)) {
// Применяем логику обработки переменных $id и $name
}
// Деструктуризация в стиле короткого синтаксиса []
foreach ($data as ["id" => $id, "name" => $name]) {
// Применяем логику обработки переменных $id и $name
}
?>Поддержка отрицательных смещений в строках
В функции для работы со строками, которые поддерживают смещения,
и в работу с символами строки по индексу
через короткий синтаксис массива [] или фигурные скобки {}
добавили поддержку отрицательных смещений в строках.
В функциях и при доступе к символам строки по индексу отрицательные смещения интерпретируются как смещения относительно конца строки.
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
?>Результат выполнения приведённого примера:
string (1) "e" int(3)
Отрицательные смещения в строках и массивах теперь также поддерживаются в простом синтаксисе разбора переменных внутри строк.
<?php
$string = 'bar';
echo "Последний символ в строке '$string' — '$string[-1]'.\n";
?>Результат выполнения приведённого примера:
Последний символ в строке 'bar' — 'r'.
Поддержка режима AEAD в модуле OpenSSL
За счёт расширения функций openssl_encrypt() и openssl_decrypt() дополнительными параметрами добавили поддержку AEAD-режимов GCM и CCM.
Преобразование значений с типом callable в тип Closure методом Closure::fromCallable()
В класс Closure добавили новый статический метод, который легко преобразовывает значения с типом callable в объекты класса Closure.
<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('значение');
?>Результат выполнения приведённого примера:
string(16) "значение"
Асинхронная обработка сигналов
Для асинхронной обработки сигналов в ядро PHP добавили функцию pcntl_async_signals(). Новая функция не использует механизм тиков, который вызывает избыточные накладные расходы.
<?php
pcntl_async_signals(true); // Включает асинхронные сигналы
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
?>Результат выполнения приведённого примера:
SIGHUP
Поддержка механизма HTTP/2 Server Push в модуле cURL
В модуль cURL добавили поддержку механизма Server Push. Для работы механизма требуется библиотека cURL версия 7.46 и выше.
Поддержка заблаговременной отправки данных работает в функции curl_multi_setopt() с новой
константой CURLMOPT_PUSHFUNCTION. В модуль также добавили константы
CURL_PUSH_OK и CURL_PUSH_DENY,
чтобы одобрить или отклонить выполнение Server Push в клиентской callback-функции.
Контекстные опции потока
В контекст потока добавили параметр tcp_nodelay.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Nullable types
Type declarations for parameters and return values can now be marked as
nullable by prefixing the type name with a question mark. This signifies
that as well as the specified type, null can be passed as an argument, or
returned as a value, respectively.
<?php
function testReturnA(): ?string
{
return 'elePHPant';
}
var_dump(testReturnA());
function testReturnB(): ?string
{
return null;
}
var_dump(testReturnB());
function test(?string $name)
{
var_dump($name);
}
test('elePHPant');
test(null);
test();The above example will output:
string(9) "elePHPant" NULL string(9) "elePHPant" NULL Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in...
Void functions
A void return type has been introduced. Functions declared with
void as their return type must either omit their return statement altogether,
or use an empty return statement. null is not a valid return value for a
void function.
<?php
function swap(&$left, &$right): void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);The above example will output:
null int(2) int(1)
Attempting to use a void function's return value simply evaluates to
null, with no warnings emitted. The reason for this is because warnings
would implicate the use of generic higher order functions.
Symmetric array destructuring
The shorthand array syntax ([]) may now be used to
destructure arrays for assignments (including within
foreach), as an alternative to the existing
list() syntax, which is still supported.
<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];
// list() style
list($id1, $name1) = $data[0];
// [] style
[$id1, $name1] = $data[0];
// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}Class constant visibility
Support for specifying the visibility of class constants has been added.
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}iterable pseudo-type
A new pseudo-type (similar to callable) called iterable has been introduced. It may be used in parameter and return types, where it accepts either arrays or objects that implement the Traversable interface. With respect to subtyping, parameter types of child classes may broaden a parent's declaration of array or Traversable to iterable. With return types, child classes may narrow a parent's return type of iterable to array or an object that implements Traversable.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}Multi catch exception handling
Multiple exceptions per catch block may now be specified using the pipe
character (|). This is useful for when different
exceptions from different class hierarchies are handled the same.
<?php
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}Support for keys in list()
You can now specify keys in list(), or its new shorthand
[] syntax. This enables destructuring of arrays with
non-integer or non-sequential keys.
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
// [] style
["id" => $id1, "name" => $name1] = $data[0];
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}Support for negative string offsets
Support for negative string offsets has been added to the
string manipulation functions
accepting offsets, as well as to
string indexing with
[] or {}. In such cases, a negative
offset is interpreted as being an offset from the end of the string.
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));The above example will output:
string (1) "e" int(3)
Negative string and array offsets are now also supported in the simple variable parsing syntax inside of strings.
<?php
$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";
?>The above example will output:
The last character of 'bar' is 'r'.
Support for AEAD in ext/openssl
Support for AEAD (modes GCM and CCM) have been added by extending the openssl_encrypt() and openssl_decrypt() functions with additional parameters.
Convert callables to Closures with Closure::fromCallable()
A new static method has been introduced to the Closure class to allow for callables to be easily converted into Closure objects.
<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');The above example will output:
string(10) "some value"
Asynchronous signal handling
A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead).
<?php
pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);The above example will output:
SIGHUP
HTTP/2 server push support in ext/curl
Support for server push has been added to the CURL extension (requires
version 7.46 and above). This can be leveraged through the
curl_multi_setopt() function with the new
CURLMOPT_PUSHFUNCTION constant. The constants
CURL_PUSH_OK and CURL_PUSH_DENY have also been
added so that the execution of the server push callback can either be
approved or denied.
Stream Context Options
The tcp_nodelay stream context option has been added.
PHP 7.0 → 7.1: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 7.0 → 7.1: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 7.0 → 7.1: Изменения поведения функций
У знакомого имени мог измениться договор: параметры, тип результата, предупреждение или исключение. Проверяют фактические входы проекта и добавляют тест на старое граничное значение.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ядро PHP
getopt() имеет третий, необязательный, параметр, в который записывается индекс, на котором остановилась обработка. Переменная в этот параметр передаётся по ссылке.
В getenv() больше не обязательно передавать параметр. Если параметр не задан, то возвращаются все текущие переменные окружения в виде ассоциативного массива.
get_headers() теперь имеет дополнительный параметр для разрешения передачи определённого пользователем потокового контекста.
output_reset_rewrite_vars() больше не сбрасывает сессионные переменные перезаписи URL.
parse_url() теперь более требовательна и поддерживает RFC3986.
unpack() теперь имеет третий необязательный параметр для определения смещения с которого начинать распаковку.
Файловая система
file_get_contents() теперь принимает отрицательные значения смещения начала поиска, если поток поддерживает смещения.
tempnam() теперь выдаёт уведомление при возврате в системный временный каталог.
JSON
json_encode() теперь принимает новую опцию,
JSON_UNESCAPED_LINE_TERMINATORS, для запрещения экранирования символов U+2028 и U+2029 когда передаётсяJSON_UNESCAPED_UNICODE.
Многобайтовые строки
mb_ereg() теперь отклоняет некорректные последовательности байтов.
mb_ereg_replace() теперь отклоняет некорректные последовательности байтов.
PDO
PDO::lastInsertId() для PostgreSQL теперь порождает ошибку, если в текущей сессии (соединении) не вызван
nextval.
PostgreSQL
pg_last_notice() теперь принимает необязательный параметр, задающий операцию. Используется одна из следующих констант:
PGSQL_NOTICE_LAST,PGSQL_NOTICE_ALLилиPGSQL_NOTICE_CLEAR.pg_fetch_all() теперь принимает второй, необязательный, параметр для задания типа результата (аналогично третьему параметру pg_fetch_array()).
pg_select() теперь принимает четвёртый, необязательный, параметр для задания типа результата (аналогично третьему параметру pg_fetch_array()).
Сессии
session_start() теперь возвращает
falseи больше не инициализирует $_SESSION, когда она не смогла запустить сессию.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP Core
getopt() has an optional third parameter that exposes the index of the next element in the argument vector list to be processed. This is done via a by-ref parameter.
getenv() no longer requires its parameter. If the parameter is omitted, then the current environment variables will be returned as an associative array.
get_headers() now has an additional parameter to enable for the passing of custom stream contexts.
output_reset_rewrite_vars() no longer resets session URL rewrite variables.
parse_url() is now more restrictive and supports RFC3986.
unpack() now accepts an optional third parameter to specify the offset to begin unpacking from.
File System
file_get_contents() now accepts a negative seek offset if the stream is seekable.
tempnam() now emits a notice when falling back to the system's temp directory.
JSON
json_encode() now accepts a new option,
JSON_UNESCAPED_LINE_TERMINATORS, to disable the escaping of U+2028 and U+2029 characters whenJSON_UNESCAPED_UNICODEis supplied.
Multibyte String
mb_ereg() now rejects illegal byte sequences.
mb_ereg_replace() now rejects illegal byte sequences.
PDO
PDO::lastInsertId() for PostgreSQL will now trigger an error when
nextvalhas not been called for the current session (the postgres connection).
PostgreSQL
pg_last_notice() now accepts an optional parameter to specify an operation. This can be done with one of the following new constants:
PGSQL_NOTICE_LAST,PGSQL_NOTICE_ALL, orPGSQL_NOTICE_CLEAR.pg_fetch_all() now accepts an optional second parameter to specify the result type (similar to the third parameter of pg_fetch_array()).
pg_select() now accepts an optional fourth parameter to specify the result type (similar to the third parameter of pg_fetch_array()).
Session
session_start() now returns
falseand no longer initializes $_SESSION when it failed to start the session.
PHP 7.0 → 7.1: Обратно несовместимые изменения
Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.
Полный официальный договор страницы — большой справочник, раскрывается по запросу
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Вызов исключения при передаче функции недостаточного количества аргументов
Раньше, если пользовательскую функцию вызывали с недостаточным количеством аргументов, выдавалось предупреждение. Теперь вместо предупреждения выбрасываться исключение 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() или array_map('extract', ...), и т. д.)
Эти функции проверяют или модифицируют объекты другой области видимости, чем
вызывают неоднозначное и неопределённое поведение.
Список таких функций:
assert() — со строкой в качестве первого аргумента
mb_parse_str() — с одним аргументом
parse_str() — с одним аргументом
<?php
(function () {
$func = 'func_num_args';
$func();
})();Результат выполнения приведённого примера:
Warning: Cannot call func_num_args() dynamically in %s on line %d
Некорректные имена классов, интерфейсов и трейтов
Следующие имена нельзя использовать как имена классов, интерфейсов или трейтов:
Преобразование числовых строк теперь учитывает научную нотацию
Целочисленные операции и конвертации числовых строк теперь учитывают научную нотацию,
включая приведение (int) и следующие функции:
intval() (с базой 10), settype(),
decbin(), decoct() и dechex().
Исправление алгоритма mt_rand()
mt_rand() теперь по умолчанию использует зафиксированную версию
алгоритма "Вихрь Мерсена". Если вы полагались на детерминированный вывод
mt_srand(), можно использовать константу MT_RAND_PHP в качестве второго,
необязательного, параметра mt_srand() для сохранения старой (неправильной) реализации.
rand() псевдоним для mt_rand() и srand() псевдоним для mt_srand()
rand() и srand() теперь являются просто синонимами для mt_rand() и mt_srand(). Это означает, что вывод следующих функций изменился: rand(), shuffle(), str_shuffle() и array_rand().
Запрет использовать символ удаления из таблицы ASCII в идентификаторах
Символ удаления ASCII (0x7F) больше нельзя использовать в
идентификаторах, не обёрнутых в кавычки.
Значение error_log изменено на syslog
Если ini-параметр error_log установлен как
syslog, то уровни ошибок PHP проецируются на уровни ошибок "syslog".
Это позволяет более тонко логировать события, а не как раньше, когда все они
записывались с уровнем "notice".
Деструкторы не вызываются на незавершённых объектах
Теперь деструкторы никогда не вызываются, если было вызвано исключение в конструкторе объекта. Раньше это поведение зависело от того, была ли ссылка на объект вне конструктора (например, в трассировке исключения).
call_user_func() обрабатывает ссылки на аргументы
Теперь call_user_func() всегда вызывает предупреждение, если вызывается функция, ожидающая ссылки в качестве параметров. Ранее это зависело от того, был ли вызов полностью определённым.
Кроме того, call_user_func() и call_user_func_array() больше не прекращают выполнение функции в этом случае. Предупреждение "expected reference" будет вызвано, но сама функция продолжит выполнение.
Оператор пустого индекса более не применим к строкам
Применение оператора пустого индекса к строке ($str[] = $x)
вызывает фатальную ошибку вместо тихого преобразования переменной к массиву.
Присвоение через механизм доступа к элементу строки по индексу применительно к пустой строке
Модификация символа в пустой строке теперь работает так же как и для не пустой. Т. е. запись по несуществующему смещению приведёт к преобразованию не целочисленного значения смещения к целому числу, дополнению строки до нужной длины символами пробела и использованию только первого символа из присваиваемой строки. Раньше, в такой ситуации, пустая строка рассматривалась как пустой массив.
<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>Результат выполнения приведённого примера в PHP 7.0:
array(1) {
[10]=>
string(3) "foo"
}
Результат выполнения приведённого примера в PHP 7.1:
string(11) " f"
Удалённые ini-директивы
Следующие ini-директивы были удалены:
session.entropy_filesession.entropy_lengthsession.hash_functionsession.hash_bits_per_character
Порядок массива, когда элементы созданы автоматически через присвоение по ссылке, был изменён
Порядок расположения элементов массива, создаваемых присвоением по ссылке не созданных на момент присвоения элементов, был изменён. К примеру:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>Результат выполнения приведённого примера в PHP 7.0:
array(2) {
["a"]=>
&int(1)
["b"]=>
&int(1)
}
Результат выполнения приведённого примера в PHP 7.1:
array(2) {
["b"]=>
&int(1)
["a"]=>
&int(1)
}
Порядок сортировки эквивалентных элементов
Внутренний алгоритм сортировки был улучшен, что может привести к отличию в порядке расположения эквивалентных элементов после сортировки по сравнению с предыдущими версиями PHP.
Замечание:
Не полагайтесь на порядок расположения эквивалентных элементов, так как он может в любой момент измениться.
Сообщения для ошибок E_RECOVERABLE
Сообщения для ошибок E_RECOVERABLE изменено с "Catchable fatal error" на "Recoverable fatal error".
Параметр $options функции unserialize()
Теперь элемент allowed_classes параметра $options функции
unserialize() строго типизирован, то есть если передать
значение с типом, отличным от array и bool,
то unserialize() вернёт false и вызовет ошибку уровня E_WARNING.
Конструктор DateTime использует микросекунды
Теперь DateTime и DateTimeImmutable
используют микросекунды при создании с текущим временем, либо в явном виде,
либо со строкой относительного времени (например, "first day of next
month"). Это означает, что сравнение двух подряд созданных экземпляров
класса скорее будет возвращать false нежели true:
<?php
new DateTime() == new DateTime();
?>Вызов исключений Error вместо фатальных ошибок
Для модуля Date при некорректных данных сериализации классов DateTime или DatePeriod, или ошибки инициализации часового пояса из сериализованных данных, будет выбрасываться исключение Error из методов __wakeup() или __set_state(), вместо вызова фатальной ошибки.
В модуле DBA функции манипулирования данными (такие как dba_insert()) теперь будут выбрасывать исключение Error вместо вызова отлавливаемой фатальной ошибки если ключ не содержит ровно двух элементов.
В модуле DOM некорректная проверка контекста схемы или RelaxNG теперь будут выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогичным образом, попытки зарегистрировать класс узла, который не расширяет правильный базовый класс, попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error.
В модуле IMAP адрес email длиннее 16385 байт теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.
Модуль Intl в случае возникновения ошибки вызова родительского конструктора в классе, наследующем Collator до вызова родительских методов теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки. Кроме того, клонирование объекта Transliterator теперь будет выбрасывать исключение Error в случае возникновения ошибки клонирования внутреннего transliterator вместо вызова фатальной ошибки.
Модуль LDAP при указании неизвестного типа модификации в ldap_batch_modify() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле mbstring функции mb_ereg() и mb_eregi() теперь будут выбрасывать исключение ParseError в случае некорректного регулярного выражения либо в случае использования опции 'e'.
В модуле Mcrypt mcrypt_encrypt() и mcrypt_decrypt() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки, если mcrypt не инициализирован.
В модуле mysqli попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле Reflection неудачное извлечение отражённого объекта или свойства объекта будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле сессий пользовательские обработчики сессии, которые не возвращают строку для идентификатора сессии, будут выбрасывать исключение Error вместо вызова фатальной ошибки, когда будет вызвана функция для генерации идентификатора.
В модуле SimpleXML попытка создания безымянного либо дублирующего атрибута будет выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле SPL попытка клонировать объект SplDirectory будет выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогично, вызов ArrayIterator::append() когда итерация объекта закончена будет выбрасывать исключение Error.
Функция assert(), когда ей передан строковый аргумент первым параметром, теперь будет выбрасывать исключение ParseError вместо вызова отлавливаемой фатальной ошибки, если PHP-код некорректен. Аналогично, вызов forward_static_call() за пределами пространства класса будет выбрасывать исключение Error.
В модуле Tidy ручное создание tidyNode будет выбрасывать исключение Error.
В модуле WDDX циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле XML-RPC циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В модуле Zip метод ZipArchive::addGlob() будет выбрасывать исключение Error вместо вызова фатальной ошибки, если отсутствует поддержка glob.
Лексически связанные переменные не могут переиспользовать имена
Переменные, привязанные к замыканию
через конструкцию use, не могут использовать те же имена, что и
любые superglobals, $this или параметры. К примеру,
все приведённые функции вызовут фатальную ошибку:
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};Кодирование и декодирование JSON
INI-настройка serialize_precision определяет точность сериализации
при кодировании значений типа float.
Теперь декодирование пустого ключа приводит к появлению свойства с пустым именем,
раньше имя свойства приводилось к значению _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() и mb_eregi()
Третий параметр функций mb_ereg() и
mb_eregi() (regs) теперь устанавливается
равным пустому массиву, если не было найдено совпадений. Ранее параметр
оставался неизменным.
Удалена поддержка потока sslv2
Поддержка потока sslv2 в OpenSSL удалена.
Запрещён "return;" для типизированных возвратов уже во время компиляции
Операторы возврата без аргументов в функциях, которые объявляют тип возвращаемого значения,
теперь вызывают E_COMPILE_ERROR (если тип возврата не
объявлен как void), даже если оператор возврата никогда
не будет достигнут.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Throw on passing too few function arguments
Previously, a warning would be emitted for invoking user-defined functions with too few arguments. Now, this warning has been promoted to an Error exception. This change only applies to user-defined functions, not internal functions. For example:
<?php
function test($param){}
test();The above example will output something similar to:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Forbid dynamic calls to scope introspection functions
Dynamic calls for certain functions have been forbidden (in the form of
$func() or array_map('extract', ...),
etc). These functions either inspect or modify another scope, and present
with them ambiguous and unreliable behavior. The functions are as follows:
assert() - with a string as the first argument
mb_parse_str() - with one arg
parse_str() - with one arg
<?php
(function () {
$func = 'func_num_args';
$func();
})();The above example will output:
Warning: Cannot call func_num_args() dynamically in %s on line %d
Invalid class, interface, and trait names
The following names cannot be used to name classes, interfaces, or traits:
Numerical string conversions now respect scientific notation
Integer operations and conversions on numerical strings now respect
scientific notation. This also includes the (int) cast
operation, and the following functions: intval() (where
the base is 10), settype(), decbin(),
decoct(), and dechex().
Fixes to mt_rand() algorithm
mt_rand() will now default to using the fixed version of
the Mersenne Twister algorithm. If deterministic output from
mt_rand() was relied upon, then
MT_RAND_PHP can be used as optional second parameter
to mt_srand() to preserve the old (incorrect)
implementation.
rand() aliased to mt_rand() and srand() aliased to mt_srand()
rand() and srand() have now been made aliases to mt_rand() and mt_srand(), respectively. This means that the output for the following functions have changed: rand(), shuffle(), str_shuffle(), and array_rand().
Disallow the ASCII delete control character in identifiers
The ASCII delete control character (0x7F) can no longer
be used in identifiers that are not quoted.
error_log changes with syslog
value
If the error_log ini setting is set to
syslog, the PHP error levels are mapped to the syslog
error levels. This brings finer differentiation in the error logs in
contrary to the previous approach where all the errors are logged with the
notice level only.
Do not call destructors on incomplete objects
Destructors are now never called for objects that throw an exception during the execution of their constructor. In previous versions this behavior depended on whether the object was referenced outside the constructor (e.g. by an exception backtrace).
call_user_func() handling of reference arguments
call_user_func() will now always generate a warning upon calls to functions that expect references as arguments. Previously this depended on whether the call was fully qualified.
Additionally, call_user_func() and call_user_func_array() will no longer abort the function call in this case. The "expected reference" warning will be emitted, but the call will proceed as usual.
The empty index operator is not supported for strings anymore
Applying the empty index operator to a string (e.g. $str[] = $x)
throws a fatal error instead of converting silently to array.
Assignment via string index access on an empty string
String modification by character on an empty string now works like for non-empty strings, i.e. writing to an out of range offset pads the string with spaces, where non-integer types are converted to integer, and only the first character of the assigned string is used. Formerly, empty strings where silently treated like an empty array.
<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>Output of the above example in PHP 7.0:
array(1) {
[10]=>
string(3) "foo"
}
Output of the above example in PHP 7.1:
string(11) " f"
Removed ini directives
The following ini directives have been removed:
session.entropy_filesession.entropy_lengthsession.hash_functionsession.hash_bits_per_character
Array ordering when elements are automatically created during by reference assignments has changed
The order of the elements in an array has changed when those elements have been automatically created by referencing them in a by reference assignment. For example:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>Output of the above example in PHP 7.0:
array(2) {
["a"]=>
&int(1)
["b"]=>
&int(1)
}
Output of the above example in PHP 7.1:
array(2) {
["b"]=>
&int(1)
["a"]=>
&int(1)
}
Sort order of equal elements
The internal sorting algorithm has been improved, what may result in different sort order of elements, which compare as equal, than before.
Note:
Don't rely on the order of elements which compare as equal; it might change anytime.
Error message for E_RECOVERABLE errors
The error message for E_RECOVERABLE errors has been changed from "Catchable fatal error" to "Recoverable fatal error".
$options parameter of unserialize()
The allowed_classes element of the $options parameter of
unserialize() is now strictly typed, i.e. if anything
other than an array or a bool is given,
unserialize() returns false and issues an E_WARNING.
DateTime constructor incorporates microseconds
DateTime and DateTimeImmutable
now properly incorporate microseconds when constructed from the current time,
either explicitly or with a relative string (e.g. "first day of next
month"). This means that naive comparisons of two newly created
instances will now more likely return false instead of true:
<?php
new DateTime() == new DateTime();
?>Fatal errors to Error exceptions conversions
In the Date extension, invalid serialization data for DateTime or DatePeriod classes, or timezone initialization failure from serialized data, will now throw an Error exception from the __wakeup() or __set_state() methods, instead of resulting in a fatal error.
In the DBA extension, data modification functions (such as dba_insert()) will now throw an Error exception instead of triggering a catchable fatal error if the key does not contain exactly two elements.
In the DOM extension, invalid schema or RelaxNG validation contexts will now throw an Error exception instead of resulting in a fatal error. Similarly, attempting to register a node class that does not extend the appropriate base class, or attempting to read an invalid property or write to a readonly property, will also now throw an Error exception.
In the IMAP extension, email addresses longer than 16385 bytes will throw an Error exception instead of resulting in a fatal error.
In the Intl extension, failing to call the parent constructor in a class extending Collator before invoking the parent methods will now throw an Error instead of resulting in a recoverable fatal error. Also, cloning a Transliterator object will now throw an Error exception on failure to clone the internal transliterator instead of resulting in a fatal error.
In the LDAP extension, providing an unknown modification type to ldap_batch_modify() will now throw an Error exception instead of resulting in a fatal error.
In the mbstring extension, the mb_ereg() and mb_eregi() functions will now throw a ParseError exception if an invalid PHP expression is provided and the 'e' option is used.
In the Mcrypt extension, the mcrypt_encrypt() and mcrypt_decrypt() will now throw an Error exception instead of resulting in a fatal error if mcrypt cannot be initialized.
In the mysqli extension, attempting to read an invalid property or write to a readonly property will now throw an Error exception instead of resulting in a fatal error.
In the Reflection extension, failing to retrieve a reflection object or retrieve an object property will now throw an Error exception instead of resulting in a fatal error.
In the Session extension, custom session handlers that do not return strings for session IDs will now throw an Error exception instead of resulting in a fatal error when a function is called that must generate a session ID.
In the SimpleXML extension, creating an unnamed or duplicate attribute will now throw an Error exception instead of resulting in a fatal error.
In the SPL extension, attempting to clone an SplDirectory object will now throw an Error exception instead of resulting in a fatal error. Similarly, calling ArrayIterator::append() when iterating over an object will also now throw an Error exception.
In the standard extension, the assert() function, when provided with a string argument as its first parameter, will now throw a ParseError exception instead of resulting in a catchable fatal error if the PHP code is invalid. Similarly, calling forward_static_call() outside of a class scope will now throw an Error exception.
In the Tidy extension, creating a tidyNode manually will now throw an Error exception instead of resulting in a fatal error.
In the WDDX extension, a circular reference when serializing will now throw an Error exception instead of resulting in a fatal error.
In the XML-RPC extension, a circular reference when serializing will now throw an instance of Error exception instead of resulting in a fatal error.
In the Zip extension, the ZipArchive::addGlob() method will now throw an Error exception instead of resulting in a fatal error if glob support is not available.
Lexically bound variables cannot reuse names
Variables bound to a closure via
the use construct cannot use the same name as any
superglobals, $this, or any parameter. For
example, all of these function definition will result in a fatal error:
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};JSON encoding and decoding
The serialize_precision ini setting now controls the
serialization precision when encoding floats.
Decoding an empty key now results in an empty property name, rather than
_empty_ as a property name.
<?php
var_dump(json_decode(json_encode(['' => 1])));The above example will output something similar to:
object(stdClass)#1 (1) {
[""]=>
int(1)
}
When supplying the JSON_UNESCAPED_UNICODE flag to
json_encode(), the sequences U+2028 and U+2029 are now
escaped.
Changes to mb_ereg() and mb_eregi() parameter semantics
The third parameter to the mb_ereg() and
mb_eregi() functions (regs) will now be
set to an empty array if nothing was matched. Formerly, the parameter would
not have been modified.
Drop support for the sslv2 stream
The sslv2 stream has now been dropped in OpenSSL.
Forbid "return;" for typed returns already at compile-time
Return statements without argument in functions which declare a return type
now trigger E_COMPILE_ERROR (unless the return type is
declared as void), even if the return statement would never be
reached.
PHP 7.0 → 7.1: Устаревшие возможности
Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
ext/mcrypt
Модуль mcrypt не развивался уже почти десять лет, а также был крайне сложным в использовании. Он был объявлен устаревшим в пользу OpenSSL. Он будет удалён из ядра PHP и перемещён в PECL в PHP 7.2.
Модификатор "e" для функций mb_ereg_replace() и mb_eregi_replace()
Модификатор шаблона e был объявлен устаревшим для функций
mb_ereg_replace() и
mb_eregi_replace().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
ext/mcrypt
The mcrypt extension has been abandonware for nearly a decade now, and was also fairly complex to use. It has therefore been deprecated in favour of OpenSSL, where it will be removed from the core and into PECL in PHP 7.2.
Eval option for mb_ereg_replace() and mb_eregi_replace()
The e pattern modifier has been deprecated for the
mb_ereg_replace() and
mb_eregi_replace() functions.
PHP 7.0 → 7.1: Другие изменения
Сюда попадают изменения поведения, конфигурации и расширений, которые не образуют новую синтаксическую конструкцию. Их сверяют с фактически установленными модулями и рабочими сценариями проекта.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Замечания и предупреждения при выполнении арифметических операций с некорректными строками
Новые ошибки уровней E_WARNING и
E_NOTICE были добавлены при использовании некорректных
строк с операторами, ожидающими числа (+-*/**%<<>>|&^) и их эквивалентами с
присваиванием. Ошибка уровня E_NOTICE выдаётся, когда строка
начинается с цифр, но далее содержит не цифровые символы, и ошибка уровня
E_WARNING выдаётся тогда, когда строка вообще не содержит
цифр.
<?php
'1b' + 'что-то';Результат выполнения приведённого примера:
Notice: A non well formed numeric value encountered in %s on line %d Warning: A non-numeric value encountered in %s on line %d
Предупреждение при переполнении экранированной восьмеричной последовательности
Ранее 3-октетная восьмеричная строка переполнялась никому ничего не сообщая.
Теперь при переполнении будет вызвана ошибка уровня
E_WARNING.
<?php
var_dump("\500");Результат выполнения приведённого примера:
Warning: Octal escape sequence overflow \500 is greater than \377 in %s on line %d string(1) "@"
Исправлена несогласованность $this
В то время как $this считается специальной переменной в PHP, ей не
хватало специальных проверок, что её не используют в качестве переменной и не
переопределили. Теперь использовать $this в качестве пользовательской
переменной запрещено. Также запрещено присваивать ей значение и использовать
в глобальном пространстве имён.
Генерация идентификаторов сессий без хеширования
Идентификаторы сессий больше не хешируются во время создания. Вместе с этим удалены следующие четыре параметра из ini-файла:
session.entropy_filesession.entropy_lengthsession.hash_functionsession.hash_bits_per_character
И добавлены два других:
session.sid_length- определяет длину идентификатора сессии. По умолчанию используется 32 символа для обеспечения обратной совместимости.session.sid_bits_per_character- определяет количество бит на каждый символ идентификатора (то есть можно увеличить количество доступных для использования в идентификаторе символов). Для обратной совместимости по умолчанию используется 4 бита.
Изменения в обработке INI-файлов
precisionЕсли установлено в -1, то будет использован режим dtoa. Значение по умолчанию 14.
serialize_precisionЕсли установлено в -1, то будет использован режим dtoa. Теперь значение по умолчанию -1.
gd.jpeg_ignore_warningЗначение по умолчанию для этой настройки php.ini изменено на 1, так что, по умолчанию, предупреждения libjpeg будут игнорироваться.
opcache.enable_cliВ PHP 7.1.2 значение по умолчанию для этой настройки php.ini изменено на 1 (включено), а в PHP 7.1.7 возвращено значение 0 (выключено)
Генерация идентификаторов сессий только с помощью CSPRNG
Идентификаторы сессий теперь создаются только с помощью CSPRNG.
Более информативное сообщение TypeError, если допустим null
Теперь исключение TypeError для проверок типа arg_info
предоставляет более информативное сообщение об ошибке. Если тип параметра или
возвращаемое значение может быть null (либо имеет значение null по умолчанию или
имеет обнуляемый тип), то теперь в сообщении будет упомянуто "must be ... or null"
или "must ... or be null."
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Notices and warnings on arithmetic with invalid strings
New E_WARNING and E_NOTICE errors
have been introduced when invalid strings are coerced using operators
expecting numbers (+-*/**%<<>>|&^) or their
assignment equivalents. An E_NOTICE is emitted when the
string begins with a numeric value but contains trailing non-numeric
characters, and an E_WARNING is emitted when the string
does not contain a numeric value.
<?php
'1b' + 'something';The above example will output:
Notice: A non well formed numeric value encountered in %s on line %d Warning: A non-numeric value encountered in %s on line %d
Warn on octal escape sequence overflow
Previously, 3-octet octal string escape sequences would overflow silently.
Now, they will still overflow, but E_WARNING will be
emitted.
<?php
var_dump("\500");The above example will output:
Warning: Octal escape sequence overflow \500 is greater than \377 in %s on line %d string(1) "@"
Inconsistency fixes to $this
Whilst $this is considered a special variable in PHP, it
lacked proper checks to ensure it wasn't used as a variable name or
reassigned. This has now been rectified to ensure that
$this cannot be a user-defined variable, reassigned to a
different value, or be globalised.
Session ID generation without hashing
Session IDs will no longer be hashed upon generation. With this change brings about the removal of the following four ini settings:
session.entropy_filesession.entropy_lengthsession.hash_functionsession.hash_bits_per_character
And the addition of the following two ini settings:
session.sid_length- defines the length of the session ID, defaulting to 32 characters for backwards compatibility)session.sid_bits_per_character- defines the number of bits to be stored per character (i.e. increases the range of characters that can be used in the session ID), defaulting to 4 for backwards compatibility
Changes to INI file handling
precisionIf the value is set to -1, then the dtoa mode 0 is used. The default value is still 14.
serialize_precisionIf the value is set to -1, then the dtoa mode 0 is used. The value -1 is now used by default.
gd.jpeg_ignore_warningThe default of this php.ini setting has been changed to 1, so by default libjpeg warnings are ignored.
opcache.enable_cliThe default of this php.ini setting has been changed to 1 (enabled) in PHP 7.1.2, and back to 0 (disabled) in PHP 7.1.7.
Session ID generation with a CSPRNG only
Session IDs will now only be generated with a CSPRNG.
More informative TypeError messages when null is allowed
TypeError exceptions for arg_info type checks will
now provide more informative error messages. If the parameter type or return
type accepts null (by either having a default value of null or being a
nullable type), then the error message will now mention this with a message
of "must be ... or null" or "must ... or be null."
PHP 7.0 → 7.1: Изменения поддержки Windows
Платформенные изменения проверяют в Windows-ветке CI: пути, кодировки, DLL, сигналы и сетевые детали нельзя надёжно подтвердить только Linux-тестом.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Поддержка длинных и UTF-8 путей
Если веб-приложение работает с UTF-8, то никаких дополнительных действий не требуется. Для приложений осуществляющих ввод/вывод по путям, заданных в кодировке отличной от UTF-8, необходимо явно задать значения в INI-файле. Проверка кодировок осуществляется в следующем порядке:
internal_encoding
default_charset
zend.multibyte
Было введено несколько функций для обработки кодовых страниц:
sapi_windows_cp_set() для установки кодировки по умолчанию
sapi_windows_cp_get() для получения текущей кодировки
sapi_windows_cp_conv() для конвертации между кодировками с использованием сигнатур аналогичным iconv()
Эти функции потокобезопасны.
Кодовая страница, используемая для вывода в консоли настраивается в зависимости от кодировки, используемой в PHP. В зависимости от конкретной системной OEM-кодировки, видимый результат может быть корректным или нет. Например, в стандартной консоли cmd.exe в системах с кодировкой 437 OEM-вывод в кодировках 1251, 1252, 1253 и некоторых других может отображаться правильно при использовании UTF-8. В тех же самых системах символы в кодировке типа 20932 будут показаны некорректно. Это относится к конкретным системным правилам для кодовой страницы, совместимости шрифтов и конкретной используемой консоли. PHP автоматически устанавливает кодовую страницу консоли в соответствии с правилами кодирования из php.ini. В некоторых случаях использование консоли отличной от стандартной cmd.exe может улучшить ситуацию.
Не забывайте, что переключение кодовой страницы во время исполнения после запуска скрипта может привести к неожиданным побочным эффектам в CLI. Лучший вариант - использовать php.ini. При использовании PHP CLI в эмуляторе консоли, который не поддерживает Unicode, это может потребоваться во избежание изменения кодировки консоли. Лучший вариант - установить кодировку по умолчанию или внутреннюю кодировку как ANSI. Также можно установить директивы output_encoding и input_encoding в требуемые значения, но следует помнить, что при отличии внутренней кодировки и кодировки вводы/вывода вы, скорее всего, получите кракозябры. В редких случаях при падении PHP, кодировка консоли может не восстанавливаться в изначальное значение. В таком случае восстановите её самостоятельно с помощью команды chcp.
Особое замечание для систем DBCS - переключение кодировки во время исполнения с помощью ini_set() может вызвать проблемы с отображением. Разница с системами без DBCS заключается в том, что расширенные символы требуют двух ячеек консоли для отображения. В некоторых случаях может произойти только отображение символов в глифы текущего шрифта, без его смены. Это в характере систем DBCS. Самый простой способ избежать проблем с отображением - отказаться от использования ini_set() для изменения кодовой страницы.
В результате поддержки UTF-8 в потоках, скрипты PHP больше не ограничены кодировками ASCII и ANSI для имён файлов. Такая поддержка доступна из коробки CLI. Для других SAPI следует изучить соответствующую документацию.
Длинные пути поддерживаются прозрачно. Пути длиннее 260 байт автоматически
дополняются префиксом \\?\. Максимальная длина пути ограничена
2048 байтами. Имейте в виду, что ограничения на длину сегмента пути (длину базового
имени) по-прежнему сохраняются.
Для лучшей переносимости настоятельно рекомендуется обрабатывать имена файлов, ввод/вывод и прочие, связанные с UTF-8 сущности. Кроме того, для консольных приложений рекомендуется использовать шрифты TrueType и не рекомендуется менять кодировку с помощью ini_set().
readline
Модуль readline поддерживается через библиотеку
» WinEditLine. Таким образом интерфейс оболочки
CLI также поддерживается (php.exe -a).
PHP_FCGI_CHILDREN
Теперь принимается во внимание PHP_FCGI_CHILDREN. Если задана эта переменная окружения, то первый процесс php-cgi.exe породит указанное количество потомков, которые будут разделять те же TCP-сокеты.
ftok()
Добавлена поддержка для ftok()
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Support for long and UTF-8 path
If a web application is UTF-8 conform, no further action is required. For applications depending on paths in non UTF-8 encodings for I/O, an explicit INI directive has to be set. The encoding INI settings check relies on the order in the core:
internal_encoding
default_charset
zend.multibyte
Several functions for codepage handling were introduced:
sapi_windows_cp_set() to set the default codepage
sapi_windows_cp_get() to retrieve the current codepage
sapi_windows_cp_is_utf8()
sapi_windows_cp_conv() to convert between codepages, using iconv() compatible signature
These functions are thread safe.
The console output codepage is adjusted depending on the encoding used in PHP. Depending on the concrete system OEM codepage, the visible output might or might be not correct. For example, in the default cmd.exe and on a system with the OEM codepage 437, outputs in codepages 1251, 1252, 1253 and some others can be shown correctly when using UTF-8. On the same system, chars in codepage like 20932 probably won't be shown correctly. This refers to the particular system rules for codepage, font compatibility and the particular console program used. PHP automatically sets the console codepage according to the encoding rules from php.ini. Using alternative consoles instead of cmd.exe directly might bring better experience in some cases.
Nevertheless be aware, runtime codepage switch after the request start might bring unexpected side effects on CLI. The preferable way is php.ini, When PHP CLI is used in a console emulator, that doesn't support Unicode, it might possibly be required, to avoid changing the console codepage. The best way to achieve it is by setting the default or internal encoding to correspond the ANSI codepage. Another method is to set the INI directives output_encoding and input_encoding to the required codepage, in which case however the difference between internal and I/O codepage is likely to cause mojibake. In rare cases, if PHP happens to crash gracefully, the original console codepage might be not restored. In this case, the chcp command can be used, to restore it manually.
Special awareness for the DBCS systems - the codepage switch on runtime using ini_set() is likely to cause display issues. The difference to the non DBCS systems is, that the extended characters require two console cells to be displayed. In certain case, only the mapping of the characters into the glyph set of the font could happen, no actual font change. This is the nature of DBCS systems, the most simple way to prevent display issues is to avoid usage of ini_set() for the codepage change.
As a result of UTF-8 support in the streams, PHP scripts are not limited to ASCII or ANSI filenames anymore. This is supported out of the box on CLI. For other SAPI, the documentation for the corresponding server is useful.
Long paths support is transparent. Paths longer than 260 bytes get
automatically prefixed with \\?\. The max path length is limited to
2048 bytes. Be aware, that the path segment limit (basename length) still
persists.
For the best portability, it is strongly recommended to handle filenames, I/O and other related topics using UTF-8. Additionally, for the console applications, the usage of a TrueType font is preferable and the usage of ini_set() for the codepage change is discouraged.
readline
The readline extension is supported
through the » WinEditLine
library. Thereby, the interactive CLI shell is
supported as well (php.exe -a).
PHP_FCGI_CHILDREN
PHP_FCGI_CHILDREN is now respected. If this environment variable is defined, the first php-cgi.exe process will exec the specified number of children. These will share the same TCP socket.
ftok()
Added support for ftok()
PHP 7.1 → 7.2
Этот узел — контрольная карта перехода PHP 7.1 → 7.2. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Новые возможности
- Новые функции
- Новые глобальные константы
- Изменения, которые ломают обратную совместимость
- Функционал, объявленный устаревшим в PHP 7.2.x
- Другие изменения
Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.
Смотрите также руководство по миграции для версий PHP 7.0.x и 7.1.x.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- New features
- New functions
- New global constants
- Backward incompatible changes
- Deprecated features in PHP 7.2.x
- Other changes
This new minor version brings with it a number of new features and a few incompatibilities that should be tested for before switching PHP versions in production environments.
See also the migration guides for PHP versions 7.0.x and 7.1.x.
PHP 7.1 → 7.2: Новые возможности языка и платформы
Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Новый тип object
Был введён новый тип, object, который может использоваться в передаваемых параметрах (контравариантность) и возвращаемых значениях (ковариантность) для любых объектов.
<?php
function test(object $obj) : object
{
return new SplQueue();
}
test(new stdClass());Загрузка модуля по имени
Для подгружаемых модулей больше не требуется указание расширения файла
(.so для Unix или .dll для Windows).
Это допускается в файле php.ini, а также в функции dl().
Разрешено переопределение абстрактных методов
Абстрактные методы теперь можно переопределить, в случаях когда абстрактный класс наследуется от другого абстрактного класса.
<?php
abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// переопределён - всё ещё сохраняя контравариантность для параметров и ковариантность для возвращаемых значений
abstract function test($s) : int;
}Sodium теперь является основным модулем
Современная криптографическая библиотека Sodium теперь стала основным модулем в PHP (как модуль sodium).
Смотрите раздел Sodium для получения полной информации.
Добавлено хеширование пароля с помощью Argon2
Был добавлен алгоритм Argon2 в API хеширования пароля, где доступны следующие константы:
Расширенные типы строк для PDO
Тип строки PDO был расширен для поддержки национальных наборов символов при эмуляции подготавливаемых запросов. Добавлены новые константы:
Эти константы используется в побитовом OR
с константой PDO::PARAM_STR:
<?php
$db->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);Дополнительная отладочная информация при эмуляции подготавливаемых запросов в PDO
Метод PDOStatement::debugDumpParams() был обновлён, чтобы включить SQL до отправки в БД, где будет показан полный необработанный запрос (включая заменённые параметры с их связанными значениями). Это было добавлено для помощи в отладке эмуляции подготавливаемых запросов (и поэтому это будет доступно только при включённой эмуляции подготавливаемых запросов).
Поддержка расширенных операций в LDAP
Была добавлена поддержка EXOP в модуль LDAP. Стали доступны следующие функции и константы:
Информация об адресе в модуле сокетов
Модуль сокетов теперь имеет возможность искать адресную информацию, а также подключаться к ней, связываться с ней и объяснять её. Для этого были добавлены следующие четыре функции:
Расширение типа параметра
Типы параметров из переопределённых методов и реализаций интерфейсов теперь могут быть опущены. Это всё ещё соответствует LSP, так как параметры типов контравариантны.
<?php
interface A
{
public function Test(array $input);
}
class B implements A
{
public function Test($input){} // тип параметра не указан $input
}Разрешена завершающая запятая для сгруппированных пространств имён
Завершающая запятая теперь может быть добавлена в синтаксис группировки use, появившегося в PHP 7.0.
<?php
use Foo\Bar\{
Foo,
Bar,
Baz,
};Поддержка proc_nice() для Windows
Функция proc_nice() теперь поддерживается в Windows.
Поддержка порядка байт в pack() и unpack()
Функции pack() и unpack() теперь поддерживают типы float и double как в прямом, так и в обратном порядке байт.
Улучшения в модуле EXIF
Модуль EXIF обновлён для поддержки большего числа форматов. Это означает, что специфичные теги правильно обрабатываются при разборе изображений функцией exif_read_data(). Новые поддерживаемые форматы:
Samsung
DJI
Panasonic
Sony
Pentax
Minolta
Sigma/Foveon
AGFA
Kyocera
Ricoh
Epson
Функции exif_read_data() и exif_thumbnail() теперь принимают потоки в качестве своих первых аргументов.
Новая функциональность в PCRE
Добавлен модификатор
Jдля установки PCRE_DUPNAMES.
SQLite3 позволяет записывать BLOB
Теперь SQLite3::openBlob() умеет открывать поля типа BLOB для записи. Раньше для таких полей было доступно только чтение.
Обратные вызовы Oracle OCI8 Transparent Application Failover
Добавлена поддержка обратных вызовов Oracle Database Transparent Application Failover (TAF). TAF позволяет приложениям PHP OCI8 автоматически переподключаться к предварительно сконфигурированной базе данных при нарушении соединения. Новая поддержка обратного вызова TAF позволяет приложениям отслеживать и контролировать переподключение во время восстановления.
Улучшения в модуле ZIP
Добавлена поддержка чтения и записи зашифрованных архивов (требуется libzip 1.2.0).
Класс ZipArchive теперь реализует интерфейс Countable.
Поток zip:// теперь принимает контекстную опцию 'password'.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
New object type
A new type, object, has been introduced that can be used for (contravariant) parameter typing and (covariant) return typing of any objects.
<?php
function test(object $obj) : object
{
return new SplQueue();
}
test(new stdClass());Extension loading by name
Shared extensions no longer require their file extension
(.so for Unix or .dll for Windows) to
be specified. This is enabled in the php.ini file, as well as in the
dl() function.
Abstract method overriding
Abstract methods can now be overridden when an abstract class extends another abstract class.
<?php
abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// overridden - still maintaining contravariance for parameters and covariance for return
abstract function test($s) : int;
}Sodium is now a core extension
The modern Sodium cryptography library has now become a core extension in PHP.
For a complete function reference, see the Sodium chapter.
Password hashing with Argon2
Argon2 has been added to the password hashing API, where the following constants have been exposed:
Extended string types for PDO
PDO's string type has been extended to support the national character type when emulating prepares. This has been done with the following constants:
These constants are utilised by bitwise OR'ing them with
PDO::PARAM_STR:
<?php
$db->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);Additional emulated prepares debugging information for PDO
The PDOStatement::debugDumpParams() method has been updated to include the SQL being sent to the DB, where the full, raw query (including the replaced placeholders with their bound values) will be shown. This has been added to aid with debugging emulated prepares (and so it will only be available when emulated prepares are turned on).
Support for extended operations in LDAP
Support for EXOP has been added to the LDAP extension. This has been done by exposing the following functions and constants:
Address Information additions to the Sockets extension
The sockets extension now has the ability to lookup address information, as well as connect to it, bind to it, and explain it. The following four functions have been added for this:
Parameter type widening
Parameter types from overridden methods and from interface implementations may now be omitted. This is still in compliance with LSP, since parameters types are contravariant.
<?php
interface A
{
public function Test(array $input);
}
class B implements A
{
public function Test($input){} // type omitted for $input
}Allow a trailing comma for grouped namespaces
A trailing comma can now be added to the group-use syntax introduced in PHP 7.0.
<?php
use Foo\Bar\{
Foo,
Bar,
Baz,
};proc_nice() support on Windows
The proc_nice() function is now supported on Windows.
pack() and unpack() endian support
The pack() and unpack() functions now support float and double in both little and big endian.
Enhancements to the EXIF extension
The EXIF extension has been updated to support a much larger range of formats. This means that their format specific tags are now properly translated when parsing images with the exif_read_data() function. The following new formats are now supported:
Samsung
DJI
Panasonic
Sony
Pentax
Minolta
Sigma/Foveon
AGFA
Kyocera
Ricoh
Epson
The EXIF functions exif_read_data() and exif_thumbnail() now support passing streams as their first argument.
New features in PCRE
The
Jmodifier for setting PCRE_DUPNAMES has been added.
SQLite3 allows writing BLOBs
SQLite3::openBlob() now allows to open BLOB fields in write mode; formerly only read mode was supported.
Oracle OCI8 Transparent Application Failover Callbacks
Support for Oracle Database Transparent Application Failover (TAF) callbacks has been added. TAF allows PHP OCI8 applications to automatically reconnect to a preconfigured database when a connection is broken. The new TAF callback support allows PHP applications to monitor and control reconnection during failover.
Enhancements to the ZIP extension
Read and write support for encrypted archives has been added (requires libzip 1.2.0).
The ZipArchive class now implements the Countable interface.
The zip:// stream now accepts a 'password' context option.
PHP 7.1 → 7.2: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 7.1 → 7.2: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 7.1 → 7.2: Обратно несовместимые изменения
Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Предотвращение возврата отрицательного нуля из функции number_format()
Раньше функция number_format() возвращала -0.
Хотя это совершенно правильно в соответствии со спецификацией чисел с плавающей точкой IEEE 754,
эта странность нежелательна для отображения отформатированных чисел в удобочитаемой форме.
<?php
var_dump(number_format(-0.01)); // Теперь выводит string(1) "0" вместо string(2) "-0"
?>Преобразование числовых ключей при приведении объектов и массивов
Теперь числовые ключи лучше обрабатываются при приведении массивов к объектам и объектов к массивам (через явное приведение, либо через функцию settype()).
То есть целочисленные (или строковые целочисленные) ключи из массивов, которые приводятся к объектам, теперь будут доступны:
<?php
// Приведение массива к объекту
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
$obj,
$obj->{'0'}, // Теперь работает
$obj->{0} // Теперь работает
);
?>Результат выполнения приведённого примера:
object(stdClass)#1 (1) {
["0"]=> // теперь это строковый ключ, а не числовой
int(1)
}
int(1)
int(1)
И теперь целочисленные (или строковые целочисленные) ключи объектов доступны при конвертации в массивы:
<?php
// Приведение объекта к массиву
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array) $obj;
var_dump(
$arr,
$arr[0], // теперь работает
$arr['0'] // теперь работает
);
?>Результат выполнения приведённого примера:
array(1) {
[0]=> // Теперь это целочисленный ключ, а не строковый
int(1)
}
int(1)
int(1)
Запретили передачу константы null в функцию get_class()
Раньше передача null в функцию get_class() возвращала
имя класса, из которого сделали вызов. Это поведение удалили, и теперь вместо
этого выдаётся ошибка уровня E_WARNING. Чтобы получить
предыдущее поведение, аргумент просто опускают.
Предупреждение при подсчёте неисчисляемых типов
Теперь при вызове функции count() с параметром,
который нельзя посчитать, будет возникать ошибка уровня E_WARNING
(это также касается функции sizeof() как псевдонима этой функции).
<?php
var_dump(
count(null), // NULL нельзя подсчитать
count(1), // Числа нельзя подсчитать
count('abc'), // Строки нельзя подсчитать
count(new stdClass), // Объекты, которые не реализуют интерфейс Countable, нельзя подсчитать
count([1,2]) // Массивы можно подсчитать
);
?>Результат выполнения приведённого примера:
Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d int(0) int(1) int(1) int(1) int(2)
Переход от ресурсов к объектам в модуле Hash
В рамках долгосрочной миграции отказа от ресурсов, модуль Hash обновили для использования объектов вместо ресурсов. Это изменение должно быть плавным для PHP-разработчиков, за исключением проверок через функцию is_resource(), которые нужно заменить на функцию is_object().
Улучшены значения по умолчанию в SSL/TLS
В значения по умолчанию внесли следующие изменения:
tls://теперь по умолчанию используется TLSv1.0 или TLSv1.1 или TLSv1.2ssl://псевдонимtls://Константы
STREAM_CRYPTO_METHOD_TLS_*по умолчанию равны TLSv1.0 или TLSv1.1 + TLSv1.2, вместо TLSv1.0
Значение, которое возвращает функция gettype() для закрытых ресурсов
Раньше вызов функции gettype() на закрытом ресурсе
возвращал строку "unknown type". Теперь функция будет возвращать строку
"resource (closed)".
is_object() и __PHP_Incomplete_Class
Раньше вызов функции is_object() на классе
__PHP_Incomplete_Class возвращал false.
Теперь будет возвращаться true.
Повышены уровни ошибок неопределённых констант
Не полностью определённые ссылки на неопределённые константы теперь будут генерировать
E_WARNING (вместо E_NOTICE).
В следующей основной версии PHP они будут генерировать исключения Error.
Поддержка Windows
Официально поддерживаемые минимальные версии Windows теперь — Windows 7 и Server 2008 R2.
Проверка значений свойств по умолчанию трейта
Проверки совместимости значений свойств по умолчанию трейта больше не выполняют приведение типа.
object для имён классов
Имя object раньше было мягко зарезервировано с PHP 7.0.
Теперь оно полноценное зарезервированное слово,
которое запрещает использовать его как имя класса, трейта или интерфейса.
Поддержка NetWare
Удалили поддержку NetWare.
Пример работы функции array_unique() с константой SORT_STRING
Хотя функция array_unique() с флагом SORT_STRING
раньше копировала массив и удаляла неуникальные элементы (без последующей упаковки массива),
теперь новый массив создаётся путём добавления
уникальных элементов. Это может привести к получению разных числовых индексов.
Изменения в работе функции bcmod() с числами с плавающей точкой
Функция bcmod() больше не обрезает числа с плавающей точкой до целых.
Таким образом, её поведение теперь соответствует функции
fmod(), а не оператору %.
Например, bcmod('4', '3.5') теперь возвращает
значение 0.5, а не 1.
Функции хеширования и некриптографические хеши
Функции hash_hmac(), hash_hmac_file(),
hash_pbkdf2() и hash_init() (с
флагом HASH_HMAC) больше не принимают некриптографические хеши.
Опции функции json_decode()
Теперь используется опция JSON_OBJECT_AS_ARRAY функции json_decode(),
если второй параметр (assoc) равен null. Раньше
флаг JSON_OBJECT_AS_ARRAY всегда игнорировался.
Вывод функций rand() и mt_rand()
Числа, которые генерируют функции rand() и mt_rand() для определённого параметра переинициализации (seed), могут отличаться от PHP 7.1 на 64-битных машинах (из-за исправления ошибки модульного смещения в реализации).
Удаление ini-настройки sql.safe_mode
Настройку конфигурации sql.safe_mode удалили.
Изменения в функциях date_parse() и date_parse_from_format()
Элемент массива zone, который возвращают функции
date_parse_from_format()
и date_parse(), теперь отображает секунды вместо
минут, а его знак инвертируется. Например, значение -120
теперь будет значением 7200.
Входящие Cookies
Начиная с PHP 7.2.34 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Prevent number_format() from returning negative zero
Previously, it was possible for the number_format()
function to return -0. Whilst this is perfectly valid
according to the IEEE 754 floating point specification, this oddity was not
desirable for displaying formatted numbers in a human-readable form.
<?php
var_dump(number_format(-0.01)); // now outputs string(1) "0" instead of string(2) "-0"Convert numeric keys in object and array casts
Numeric keys are now better handled when casting arrays to objects and objects to arrays (either from explicit casting or by settype()).
This means that integer (or stringy integer) keys from arrays being casted to objects are now accessible:
<?php
// array to object
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
$obj,
$obj->{'0'}, // now accessible
$obj->{0} // now accessible
);The above example will output:
object(stdClass)#1 (1) {
["0"]=> // string key now, rather than integer key
int(1)
}
int(1)
int(1)
And integer (or stringy integer) keys from objects being casted to arrays are now accessible:
<?php
// object to array
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array) $obj;
var_dump(
$arr,
$arr[0], // now accessible
$arr['0'] // now accessible
);The above example will output:
array(1) {
[0]=> // integer key now, rather than string key
int(1)
}
int(1)
int(1)
Disallow passing null to get_class()
Previously, passing null to the get_class() function
would output the name of the enclosing class. This behaviour has now been
removed, where an E_WARNING will be output instead. To
achieve the same behaviour as before, the argument should simply be omitted.
Warn when counting non-countable types
An E_WARNING will now be emitted when attempting to
count() non-countable types (this includes the
sizeof() alias function).
<?php
var_dump(
count(null), // NULL is not countable
count(1), // integers are not countable
count('abc'), // strings are not countable
count(new stdClass), // objects not implementing the Countable interface are not countable
count([1,2]) // arrays are countable
);The above example will output:
Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d int(0) int(1) int(1) int(1) int(2)
Move ext/hash from resources to objects
As part of the long-term migration away from resources, the Hash extension has been updated to use objects instead of resources. The change should be seamless for PHP developers, except for where is_resource() checks have been made (which will need updating to is_object() instead).
Improve SSL/TLS defaults
The following changes to the defaults have been made:
tls://now defaults to TLSv1.0 or TLSv1.1 or TLSv1.2ssl://an alias oftls://STREAM_CRYPTO_METHOD_TLS_*constants default to TLSv1.0 or TLSv1.1 + TLSv1.2, instead of TLSv1.0 only
gettype() return value on closed resources
Previously, using gettype() on a closed resource would
return a string of "unknown type". Now, a string of
"resource (closed)" will be returned.
is_object() and __PHP_Incomplete_Class
Previously, using is_object() on the
__PHP_Incomplete_Class class would return false.
Now, true will be returned.
Promote the error level of undefined constants
Unqualified references to undefined constants will now generate an
E_WARNING (instead of an E_NOTICE).
In the next major version of PHP, they will generate
Error exceptions.
Windows support
The officially supported, minimum Windows versions are now Windows 7/Server 2008 R2.
Checks on default property values of traits
Compatibility checks upon default trait property values will no longer perform casting.
object for class names
The object name was previously soft-reserved in PHP 7.0.
This is now hard-reserved, prohibiting it from being used as a class, trait,
or interface name.
NetWare support
Support for NetWare has now been removed.
array_unique() with SORT_STRING
array_unique() with SORT_STRING
builds the returned array by adding the unique elements to a new array;
formerly, it was a copy of the input from which the non-unique elements
were removed.
Both hold the same elements under the same keys, but if the element with
the largest integer key is among those removed, the index generated for an
element appended to the returned array differs from the one the input
would have generated.
bcmod() changes with floats
The bcmod() function no longer truncates fractional
numbers to integers. As such, its behavior now follows
fmod(), rather than the % operator.
For example bcmod('4', '3.5') now returns
0.5 instead of 1.
Hashing functions and non-cryptographic hashes
The hash_hmac(), hash_hmac_file(),
hash_pbkdf2(), and hash_init() (with
HASH_HMAC) functions no longer accept non-cryptographic
hashes.
json_decode() function options
The json_decode() function option,
JSON_OBJECT_AS_ARRAY, is now used if the second
parameter (assoc) is null. Previously,
JSON_OBJECT_AS_ARRAY was always ignored.
rand() and mt_rand() output
Sequences generated by rand() and mt_rand() for a specific seed may differ from PHP 7.1 on 64-bit machines (due to the fixing of a modulo bias bug in the implementation).
Removal of sql.safe_mode ini setting
The sql.safe_mode ini setting has now been removed.
Changes to date_parse() and date_parse_from_format()
The zone element of the array returned by date_parse() and
date_parse_from_format() represents seconds instead of
minutes now, and its sign is inverted. For instance -120
is now 7200.
Incoming Cookies
As of PHP 7.2.34, the names of incoming cookies are no longer url-decoded for security reasons.
PHP 7.1 → 7.2: Устаревшие возможности
Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Строки без кавычек
Строки без кавычек, которые не являются существующими глобальными константами, считались за строки.
Такое поведение раньше вызывало ошибку уровня E_NOTICE, но теперь будет E_WARNING.
В следующей основной версии PHP вместо ошибки будет выбрасываться исключение Error.
<?php
var_dump(NONEXISTENT);
/* Вывод:
Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d
string(11) "NONEXISTENT"
*/png2wbmp() и jpeg2wbmp()
Функции png2wbmp() и jpeg2wbmp() из модуля GD объявлены устаревшими и будут удалены в следующей основной версии PHP.
Вариант INTL_IDNA_VARIANT_2003
В модуле Intl объявлен устаревшим вариант
INTL_IDNA_VARIANT_2003, который в настоящее время
используется по умолчанию для функций idn_to_ascii()
и idn_to_utf8(). В PHP 7.4 значение по умолчанию будет изменено
на INTL_IDNA_VARIANT_UTS46, а в следующей основной версии PHP
константа INTL_IDNA_VARIANT_2003 будет полностью удалена.
Функция __autoload()
Функция __autoload() была объявлена устаревшей, потому что она уступает альтернативной функции spl_autoload_register() (из-за того, что не может иметь очередь из функций автозагрузки), и ввиду того, что нет совместимости между этими двумя стилями автозагрузки.
Параметр track_errors и переменная $php_errormsg
Когда параметр track_errors включён в ini-настройках,
переменная $php_errormsg создаётся в локальной области видимости,
когда происходит не фатальная ошибка. Учитывая, что предпочтительным способом получения такой информации об ошибке
является использование функции error_get_last(), данная возможность была объявлена устаревшей.
Функция create_function()
Учитывая проблемы c безопасностью данной функции (из-за того, что она является обёрткой над eval()), эта функция объявлена устаревшей. Предпочтительной альтернативой является использование анонимных функций.
Параметр mbstring.func_overload
Учитывая проблемы совместимости строковых функций, используемых в окружениях с включённым этим параметром, этот параметр объявлен устаревшим.
Приведение типа (unset)
Приведение любого выражения с использованием этого типа всегда приводит к null, и поэтому
этот избыточный тип приведения объявлен устаревшим.
parse_str() без второго параметра
Без передачи второго параметра функции parse_str(), параметры строки запроса будут заполнять текущую таблицу символов (будут доступны как переменные в локальной области видимости). Учитывая последствия для безопасности из-за этого, использование parse_str() без второго параметра объявлено устаревшим. Эта функция всегда должна использоваться с двумя аргументами, так как во второй аргумент сохраняются параметры строки запроса в качестве элементов массива.
Функция gmp_random()
Эта функция генерирует случайное число, основанное на диапазоне, который вычисляется в зависимости от платформы, размера лимба (limb). Из-за этого данная функция объявлена устаревшей. Предпочтительным способом генерации случайного числа через модуль GMP является использование функций gmp_random_bits() и gmp_random_range().
Функция each()
Эта функция намного медленнее по итерации, чем использование обычного
foreach, и создаёт проблемы с реализацией для некоторых
изменений языка, поэтому данная функция объявлена устаревшей.
assert() со строковым аргументом
Использование assert() со строковым параметром требовало передачи строки для исполнения в eval(). Учитывая возможность удалённого выполнения кода, использование assert() со строковым аргументом теперь объявлено устаревшим в пользу использования логических выражений.
Аргумент $errcontext в обработчиках ошибок
Аргумент $errcontext содержит все локальные переменные в месте,
где была произошла ошибка. Учитывая редкое его использование и проблемы, связанные с
внутренней оптимизацией, этот параметр объявлен устаревшим. Вместо этого рекомендуется использовать отладчик для получения информации об ошибках.
Функция read_exif_data()
Псевдоним read_exif_data() был объявлен устаревшим в пользу функции exif_read_data().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Unquoted strings
Unquoted strings that are non-existent global constants are taken to be
strings of themselves. This behaviour used to emit an
E_NOTICE, but will now emit an
E_WARNING. In the next major version of PHP, an
Error exception will be thrown instead.
<?php
var_dump(NONEXISTENT);
/* Output:
Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d
string(11) "NONEXISTENT"
*/png2wbmp() and jpeg2wbmp()
The png2wbmp() and jpeg2wbmp() functions from the GD extension have now been deprecated and will be removed in the next major version of PHP.
INTL_IDNA_VARIANT_2003 variant
The Intl extension has deprecated the
INTL_IDNA_VARIANT_2003 variant, which is currently
being used as the default for idn_to_ascii() and
idn_to_utf8(). PHP 7.4 will see these defaults changed to
INTL_IDNA_VARIANT_UTS46, and the next major version of
PHP will remove INTL_IDNA_VARIANT_2003 altogether.
__autoload() method
The __autoload() method has been deprecated because it is inferior to spl_autoload_register() (due to it not being able to chain autoloaders), and there is no interoperability between the two autoloading styles.
track_errors ini setting and $php_errormsg variable
When the track_errors ini setting is enabled, a
$php_errormsg variable is created in the local scope when
a non-fatal error occurs. Given that the preferred way of retrieving such
error information is by using error_get_last(), this
feature has been deprecated.
create_function() function
Given the security issues of this function (being a thin wrapper around eval()), this dated function has now been deprecated. The preferred alternative is to use anonymous functions.
mbstring.func_overload ini setting
Given the interoperability problems of string-based functions being used in environments with this setting enabled, it has now been deprecated.
(unset) cast
Casting any expression to this type will always result in null, and so
this superfluous casting type has now been deprecated.
parse_str() without a second argument
Without the second argument to parse_str(), the query string parameters would populate the local symbol table. Given the security implications of this, using parse_str() without a second argument has now been deprecated. The function should always be used with two arguments, as the second argument causes the query string to be parsed into an array.
gmp_random() function
This function generates a random number based upon a range that is calculated by an unexposed, platform-specific limb size. Because of this, the function has now been deprecated. The preferred way of generating a random number using the GMP extension is by gmp_random_bits() and gmp_random_range().
each() function
This function is far slower at iteration than a normal
foreach, and causes implementation issues for some
language changes. It has therefore been deprecated.
assert() with a string argument
Using assert() with a string argument required the string to be eval()'ed. Given the potential for remote code execution, using assert() with a string argument has now been deprecated in favour of using boolean expressions.
$errcontext argument of error handlers
The $errcontext argument contains all local variables of
the error site. Given its rare usage, and the problems it causes with
internal optimisations, it has now been deprecated.
Instead, a debugger should be used to retrieve
information on local variables at the error site.
read_exif_data() function
The read_exif_data() alias has been deprecated. The exif_read_data() function should be used instead.
PHP 7.1 → 7.2: Другие изменения
Сюда попадают изменения поведения, конфигурации и расширений, которые не образуют новую синтаксическую конструкцию. Их сверяют с фактически установленными модулями и рабочими сценариями проекта.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Перемещение utf8_encode() и utf8_decode()
Функции utf8_encode() и utf8_decode() были перемещены в стандартную библиотеку в качестве функций по работе со строками. В предыдущих версиях для их использования необходимо было установить модуль XML.
Изменения mail() и mb_send_mail()
Параметр $additional_headers функций mail() и mb_send_mail() теперь также принимает массив (array) вместо строки (string).
Поддержка LMDB
Модуль DBA получил поддержку LMDB.
Изменения в системе сборки PHP
Unix: Теперь для сборки PHP требуется autoconf 2.64 или выше.
Unix: Для параметра конфигурации
--with-pdo-ociболее не нужно указывать версию Oracle Instant Client.Unix: Удалён параметр конфигурации
--enable-gd-native-ttf. Он не использовался с PHP 5.5.0.Windows: Добавлен параметр конфигурации
--with-config-profile. Он может использоваться для сохранения определённых конфигураций, таких как магический файл config.nice.bat.
Изменения в GD
Теперь функция imageantialias() доступна при компиляции с системной библиотекой libgd.
Функция imagegd() сохраняет truecolor-изображения как истинные truecolor-изображения. Раньше они преобразовывались в изображения с фиксированной палитрой.
Перемещение MCrypt в PECL
Модуль MCrypt был удалён из ядра PHP и перемещён в PECL. Библиотека mcrypt не обновлялась с 2007 года и использовать её крайне не рекомендуется. Вместо неё используйте модуль OpenSSL или Sodium.
session_module_name()
Передача значения "user" в опцию session_module_name()
теперь приведёт к ошибке уровня E_RECOVERABLE_ERROR. Ранее
это просто игнорировалось.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Moving of utf8_encode() and utf8_decode()
The utf8_encode() and utf8_decode() functions have now been moved to the standard extension as string functions, whereas before the XML extension was required for them to be available.
Changes to mail() and mb_send_mail()
The $additional_headers parameter of mail() and mb_send_mail() now also accepts an array instead of a string.
LMDB support
The DBA extension now has support for LMDB.
Changes to the PHP build system
Unix: Autoconf 2.64 or greater is now required to build PHP.
Unix:
--with-pdo-ociconfigure argument no longer needs the version number of the Oracle Instant Client.Unix:
--enable-gd-native-ttfconfigure argument has been removed. This was not used since PHP 5.5.0.Windows:
--with-config-profileconfigure argument has been added. This can be used to save specific configures, much like the magical config.nice.bat file.
Changes to GD
imageantialias() is now also available if compiled with a system libgd.
imagegd() stores truecolor images as real truecolor images. Formerly, they have been converted to palette.
Moving MCrypt to PECL
The MCrypt extension has now been moved out of the core to PECL. Given the mcrypt library has not seen any updates since 2007, its usage is highly discouraged. Instead, either the OpenSSL or Sodium extension should be used.
session_module_name()
Passing "user" to session_module_name()
now raises an error of level E_RECOVERABLE_ERROR. Formerly,
this has been silently ignored.
Контроль перед переключением production
Все относящиеся к проекту несовместимости должны иметь воспроизводимый тест. Deprecation не подавляют: его устраняют или записывают владельца и срок. Новые функции применяют только после повышения минимальной версии. Затем повторяют smoke-тест в том же SAPI и на том же типе данных, что используется в production.
Источники и обсуждения
- PHP Manual: Migrating from PHP 5.5.x to PHP 5.6.x
- PHP Manual: New features
- PHP Manual: New functions
- PHP Manual: New global constants
- PHP Manual: Changed functions
- PHP Manual: Backward incompatible changes
- PHP Manual: Deprecated features in PHP 5.6.x
- PHP Manual: Other changes to extensions
- PHP Manual: OpenSSL changes in PHP 5.6.x
- PHP Manual: Migrating from PHP 5.6.x to PHP 7.0.x
- PHP Manual: New features
- PHP Manual: New Classes and Interfaces
- PHP Manual: New functions
- PHP Manual: New Global Constants
- PHP Manual: Changed functions
- PHP Manual: Backward incompatible changes
- PHP Manual: Deprecated features in PHP 7.0.x
- PHP Manual: Removed Extensions and SAPIs
- PHP Manual: Changes in SAPI Modules
- PHP Manual: Other Changes
- PHP Manual: Migrating from PHP 7.0.x to PHP 7.1.x
- PHP Manual: New features
- PHP Manual: New functions
- PHP Manual: New global constants
- PHP Manual: Changed functions
- PHP Manual: Backward incompatible changes
- PHP Manual: Deprecated features in PHP 7.1.x
- PHP Manual: Other changes
- PHP Manual: Windows Support
- PHP Manual: Migrating from PHP 7.1.x to PHP 7.2.x
- PHP Manual: New features
- PHP Manual: New functions
- PHP Manual: New global constants
- PHP Manual: Backward incompatible changes
- PHP Manual: Deprecated features in PHP 7.2.x
- PHP Manual: Other changes
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


