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

Несмотря на то, что большая часть существующего кода 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 2 notes

up
3
Roger
5 months 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.
up
-6
Someone
1 year ago
Beware, now default_charset in PHP 5.6 is UTF-8, instead of blank value like in previous versions. So if you use 8-bit charset like iso-8859-1 then your non-ascii characters will be broken until you explicitly set default_charset to blank value or to your actual character set. HTML meta tag doesn't work anymore because HTTP headers have more proirity over them. And Apache AddDefaultCharset directive has lower proirity too.
To Top