PHP 7.1.21 Released

Изменения, ломающие обратную совместимость

Несмотря на то, что большая часть существующего кода PHP 5 должна работать без изменений, все же ознакомьтесь с некоторыми изменениями, которые могут сказаться на обратной совместимости:

Ключи массива не будут перезаписаны при определении массива как свойства класса через литерал массива

Ранее в массивах, заданные как свойства класса со смешанными явными и неявными ключами, элементы с явно заданными ключами могли молча перезаписываться, если явный ключ пересекался с последовательным неявным ключом. Например:

<?php
class {
    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, будут завершаться с ошибкой, если его не передать.

Загрузка файлов с помощью cURL

Теперь загрузка с использованием синтаксиса @file требует установки CURLOPT_SAFE_UPLOAD в значение FALSE. Вместо этого следует использовать CURLFile.

add a note add a note

User Contributed Notes 1 note

up
1
Roger
1 year ago
Another breaking change involves opening the special "php://input" stream for decompression. In PHP 5.5, the following code would allow PHP to decode a gzip'd request input stream:

<?php
// Open the input stream for requests with Content-Encoding: gzip.
$input = gzopen('php://input','r');
// This has the same effect as fopen('compress.zlib://php://input','r').

// Get the decompressed request body.
var_dump(stream_get_contents($input));
?>

However in PHP 5.6 this does not work. Instead PHP gives the following warning: gzopen(): cannot represent a stream of type Input as a File Descriptor.

It is unclear whether this is a bug or intentional, backward-incompatible change.
To Top