Оглавление:

  1. Изменения не совместимые со старыми версиями
  2. Новые особенности
  3. Изменения в модулях SAPI
  4. Устаревшая функциональность
  5. Изменённые функции
  6. Новые функции
  7. Новые классы и интерфейсы
  8. Удалённые расширения и SAPI
  9. Другие изменения в расширениях
  10. Новые глобальные константы
  11. Изменение в работе файла INI
  12. Поддержка Windows
  13. Другие изменения

1. Изменения не совместимые со старыми версиями

Изменения языка

Изменения по работе с переменными

  • Ссылки на непрямые переменные, свойства и методы теперь интерпретируются слева-направо. Несколько примеров:

Для восстановления предыдущего поведения добавьте явные фигурные скобки:

  • Ключевое слово global теперь принимает только простые переменные. Вместо

теперь нужно писать так:

  • Скобки вокруг переменных или вызовов функций больше не имеют какого либо влияния на их поведение. Например, следующий код, где результат вызова функции передаётся функции по ссылке

теперь будет вызывать ошибку строгих стандартов, где бы не использовались скобки. Раньше для второго случая не генерировалось предупреждение.

  • Элементы массива или свойства объекта, которые создаются автоматически во время назначения по ссылке, теперь будут в ином порядке в результатах. Например

теперь результатом будет массив [«a» => 1, «b» => 1], в то время как раньше результатом было [«b» => 1, «a» => 1];

Связанные RFC:

https://wiki.php.net/rfc/uniform_variable_syntax

https://wiki.php.net/rfc/abstract_syntax_tree

Изменения для list()

  • list() больше не будет назначать переменные в обратном порядке. Например

теперь результатом будет $array == [1, 2, 3] вместо [3, 2, 1]. Обратите внимание, что изменился только порядок назначения, но назначенные значения остаются прежними. Например, нормальное использование вроде

сохранит текущее поведение.

  • Больше неразрешено назначение пустого list(). Таким образом, все последующие примеры неверны:
  • list() больше не поддерживает распакованных строк (хотя раньше они поддерживались в некоторых случаях). Код

теперь будет иметь результат $x == null и $y == null (без замечаний) вместо $x == "x" и $y == "y". Кроме того, list() теперь гарантированно работает с объектами реализации ArrayAccess, например.

теперь будет иметь результат $a == 0 и $b == 1. Раньше обе $a и $b были null.

Связанные RFC:

https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list

https://wiki.php.net/rfc/fix_list_behavior_inconsistency

Изменения для foreach

Итерации с foreach() больше не оказывают какого-либо эффекта на внутренний указатель массива, которые может быть затронут через функции из рода current()/next()/и т.д. Например

теперь напечатает значение int(0) три раза. Раньше вывод был int(1), int(2) и bool(false).

  • Когда итерируется массив по величине, foreach теперь всегда будет оперировать с копией массива, таким образом, изменения массива во время итераций не окажут влияния на итерационное поведение. Например

теперь напечатает все три элемента (0 1 2), а раньше второй элемент 1 пропускался (0 2).

  • Когда итерируется массив по ссылки, модификации к массиву будут продолжать оказывать влияние на итерацию. Тем не менее, теперь в ряде случаев PHP будет выполнять работу лучше по поддержанию верной позиции. Например, добавленный к массиву во время итерации по ссылке

теперь также будет перебирать и добавленный элемент. Следовательно вывод этого примера будет "int(0) int(1)", в то время как раньше вывод был только "int(0)".

  • Перебор простых (non-Traversable) объектов по значению или по ссылке будет вести себя как перебор массивов по ссылке. Это соответствует предыдущему поведению помимо более точному управлению позиции, упомянутой в предыдущем пункте.

Перебор Traversable объектов остаётся неизменным.

Связанная RFC: https://wiki.php.net/rfc/php7_foreach

Изменения в обработке параметра

  • Больше невозможно задать два параметра функции с одинаковым именем. Например, следующий метод вызовет ошибку во время компиляции:

Код вроде этого должен быть изменён для использования отдельных имён параметров, например:

  • Функции func_get_arg() и func_get_args() больше не возвращают первоначальное значение, которое было передано в параметр и вместо этого будут предоставлять текущую величину (которая могла и измениться). Например

теперь будет печатать "2" вместо "1". Этот код должен быть изменён для выполнении модификаций после вызова func_get_arg(s)

или полностью избежать изменения параметров:

  • Аналогично исключение цепочек вызова больше не будет отображать первоначальное значение, которое было передано в функцию, а показывать вместо него изменённое значение. Например

теперь приведёт к результату в трассировке стека:

а раньше было так:

Хотя это не должно оказать влияние на поведение вашего кода при выполнении, полезно знать об этой разнице для целей отладки.

Такое же ограничение распространяется также на debug_backtrace() и другие функции, контролирующие аргументы функций..

Связанные RFC: https://wiki.php.net/phpng

Изменения в обработке целых чисел

  • Невалидные восьмеричные литералы (содержащие цифры больше 7) теперь вызывают ошибку компилятора. Например, следующее больше невалидно:

Раньше невалидные восьмеричные (и любые следующие валидные цифры) просто игнорировались. Раньше бы $i имел значение 7, поскольку последние две цифры были бы молча отброшены.

  • Битовые сдвиги отрицательных чисел теперь выбросят ArithmeticError:
  • Левый битовый сдвиг числа бита за пределами ширины бита целого числа всегда будет приводить к результату 0:

Раньше поведение этого кода зависло от используемой архитектуры CPU. Например, на x86 (включая x86-64) результат был int(1),, поскольку сдвиг операнда был обёрнут.

  • Подобным образом правый битовый сдвиг на число бит за пределами шитовой ширины целого числа всегда будет приводить к результату 0 или -1 (в зависимости от знака):

Связанные RFC: https://wiki.php.net/rfc/integer_semantics

Изменения в обработке строк

Строки, которые содержат шестнадцатеричные числа, больше не рассматриваются как числовые и больше не получают специальной обработки. Несколько примеров нового поведения:

filter_var() может быть использован для проверки, содержит ли строка шестнадцатеричное число или конвертирует такую строку в целочисленное число:

  • Благодаря дополнению в Unicode Codepoint Escape Syntax для строк в двойных кавычках и встроенных документах, "u{", после которой следуют невалидная последовательность, вызовет ошибку:

Для избежания этого нужно экранировать первый слэш:

Тем не менее, "u" без последующей { не затронуты. Таким образом, следующий код не приведёт к ошибке и будет прекрасно работать как и раньше:

Связанные RFC:

* https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings

* https://wiki.php.net/rfc/unicode_escape

Изменения в обработке ошибок

  • Теперь есть два класса исключений: Exception и Error. Оба класса реализуют новый интерфейс Throwable. Типы подсказок в коде обработки исключений, возможно, придётся изменить, чтобы учесть это.
  • Некоторые фатальные ошибки и восстанавливаемые фатальные ошибки теперь выбрасывают Error. Error — это отдельный от Exception класс, эти исключение не будут ловиться существующими блоками try/catch.

Для восстанавливаемых фатальных ошибок, которые были преобразованы в исключения, больше невозможно молча игнорировать ошибку от обработчика ошибок. В особенности больше невозможно игнорировать ошибки с type.

  • Ошибки парсера теперь генерируют ParseError, которые наследует Error. Обработка ошибок для eval() на потенциально невалидном коде должан быть изменена на перехват ParseError в дополнение к предыдущей возвращаемой величине / error_get_last() на основе обращения.
  • Конструкторы внутренних классов всегда будут выбрасывать исключение в случае неудачи. Раньше некоторые конструкторы возвращали NULL или неиспользуемый объект.
  • Уровень ошибок некоторых предупреждений E_STRICT был изменён.

Связанные RFC:

https://wiki.php.net/rfc/engine_exceptions_for_php7

https://wiki.php.net/rfc/throwable-interface

https://wiki.php.net/rfc/internal_constructor_behaviour

https://wiki.php.net/rfc/reclassify_e_strict

Другие изменения в языке

  • Удалена поддержка формирования несовместимого контекста this для статичных вызовов к нестатичным вызовам.

Обратите внимание, что это только применимо к вызовам из несовместимого контекста. В классе B, наследующем от A, вызов должен быть позволен без каких либо замечаний.

  • Больше невозможно использовать следующие имена классов, интерфейсов и траэйтов (без учёта регистра):

Это применимо к объявлению класса/интерфейса/трэйта, class_alias() и использованию утверждений.

Более того, следующие имена класса, интерфейса и трэйта зарезервированы для будущего использования, но ещё не приводят к ошибке во время использования:

  • Конструкции языка yield больше не требуют круглых скобок когда используются в контекстных выражения. Теперь правоассоциативной оператор с приоритетом между "печать" и оператором "=>. Это может приводить к различному поведению в различных случаях, например:

Такие случае всегда могут быть разрешены добавлением дополнительных скобок.

  • Удаление тегов ASP (<%) и script (<script language=php>). (RFC: https://wiki.php.net/rfc/remove_alternative_php_tags)
  • Удалена поддержка присвоения результата new по ссылке.
  • Убрана поддержка вызовов с заданной областью не статичных методов для несовместимого контекста $this. Смотрите подробности в https://wiki.php.net/rfc/incompat_ctx.
  • Удаление поддержки комментариев # в файлах ini. Используйте для комментариев ; вместо них.
  • $HTTP_RAW_POST_DATA больше не доступна. Используйте вместо поток php://input.

Изменения в стандартных библиотеках

  • call_user_method() и call_user_method_array() больше не существуют.
  • ob_start() больше не выводит E_ERROR, но вместо него E_RECOVERABLE_ERROR в случае создания выводного буфера в обработчике выводного буфера.
  • Улучшен zend_qsort (используется алгоритм гибридной сортировки) для лучшей производительности, также переименован zend_qsort в zend_sort.
  • Добавлен стабильный алгоритм сортировки zend_insert_sort.
  • Удалена функция dl() на fpm-fcgi.
  • setcookie() с пустым именем кукиз теперь вызывают WARNING (предупреждение) и больше не отправляют пустую строку заголовка set-cookie.

Другое

Curl:

  • Удалена поддержка для отключающей опции CURLOPT_SAFE_UPLOAD. Все загружаемые curl файлы должны использовать curl_file / CURLFile API.

Дата:

  • Удалён параметр $is_dst из mktime() и gmmktime().

DBA

  • dba_delete() теперь возвращает false если ключ также не был найден в обработчике ini файла.

GMP

  • Теперь требуется libgmp версии 4.2 или новее.
  • gmp_setbit() и gmp_clrbit() теперь возвращают FALSE для отрицательных индексов, далая их последовательными с другими функциями GMP.

Intl:

  • Удалены устаревшие псевдонимы datefmt_set_timezone_id() и IntlDateFormatter::setTimeZoneID(). Используйте вместо них datefmt_set_timezone() и IntlDateFormatter::setTimeZone().

libxml:

  • Добавлена опция парсинга LIBXML_BIGLINES. Она доступна начиная с libxml 2.9.0 и добавляет поддержку для номеров строк >16-бит в отчётах об ошибках.

Mcrypt

  • Удаление устаревших псевдонимов mcrypt_generic_end() в пользу mcrypt_generic_deinit().
  • Удаление устаревших функций mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() и mcrypt_ofb() в пользу mcrypt_encrypt() и mcrypt_decrypt() с флагом MCRYPT_MODE_*.

Сессия

  • session_start() принимает все настройки INI settings как массив, например, [‘cache_limiter’=>’private’] устанавливает session.cache_limiter=private. Она также поддерживает 'read_and_close', которая закрывает сессионные данные немедленно после чтения данных.
  • Сохранение обработчиков accepts validate_sid(), update_timestamp(), которые валидируют существование ID сессии, обновляют метку времени сессионных данных. Совместимость со старыми определёнными пользователями обработчиками сохранения оставлена.
  • Добавлен SessionUpdateTimestampHandlerInterface. validateSid(), updateTimestamp() определены в этом интерфейсе.
  • session.lazy_write(default=On) настрока INI включает запись данных сессии только когда данные сессии обновляются.

Opcache

  • Удалена конфигурационная директива opcache.load_comments. Сейчас загрузка комментариев doc ничего не делает и всегда включена.

OpenSSL:

  • Удаление контекстной опции SSL "rsa_key_size" в пользу автоматических настроек надлежащего размера, заданного согласованным криптографическим алгоритмом.
  • Удалены контекстные опции SSL "CN_match" и "SNI_server_name". Используйте вместо неё автоматическое определение или опцию "peer_name".

PCRE:

  • Удалена поддержка для модификатора /e (PREG_REPLACE_EVAL). Используйте вместо него preg_replace_callback().

PDO_pgsql:

  • Удалён атрибует PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT в пользу ATTR_EMULATE_PREPARES.

Стандартные:

  • Удалена поддержка строковых категорий в etlocale(). Используйте вместо неё константы LC_*.
  • Удалена set_magic_quotes_runtime() и её псевдоним magic_quotes_runtime().

JSON:

  • Отклонён несовместимый формат номеров RFC 7159 в строке json_decode — верхний уровень (07, 0xff, .1, -.1) и все уровни ([1.], [1.e1])
  • Вызов json_decode с первым аргументом равным PHP строке или величине, которая при приведении к строке является пустой строкой (NULL, FALSE) приводит к результату ошибка синтаксиса JSON.

Поток:

  • Удаление set_socket_blocking() в пользу его псевдонима stream_set_blocking().

XSL:

  • Удалена ini опция xsl.security_prefs. Используйте вместо неё XsltProcessor::setSecurityPrefs().

2. Новые особенности

Ядро

  • Добавлено групповое использование объявлений. (RFC: https://wiki.php.net/rfc/group_use_declarations)
  • Добавлен объединяющий оператор null (??). (RFC: https://wiki.php.net/rfc/isset_ternary)
  • Поддержка строк с длинной >= 2^31 байт в 64-битных сборках.
  • Добавлен метод Closure::call() (работает только с классами пользовательского пространства).
  • Добавлен синтаксис u{xxxxxx} Unicode Codepoint Escape для строк в двойных кавычках и встроенных документах.
  • define() теперь поддерживает массивы как константные величины, фиксит контроль, где define() до сих пор не поддерживает синтаксис констант.
  • Добавлен оператор сравнения (<=>), также известный как оператор «космический корабль». (RFC: https://wiki.php.net/rfc/combined-comparison-operator)
  • Добавлен yield из оператора для делегирования сопрограмм вроде Генераторов (Generators). (RFC: https://wiki.php.net/rfc/generator-delegation)
  • Зарезервированные ключевые слова теперь могут быть использованы в различных новых контекстах. (RFC: https://wiki.php.net/rfc/context_sensitive_lexer)
  • Добавлена поддержка для скалярных объявлений и строго режима объявления с использованием (strict_types=1) (RFC: https://wiki.php.net/rfc/scalar_type_hints_v5)
  • Добавлена поддержка для криптографически безопасного языка пользователя RNG (RFC: https://wiki.php.net/rfc/easy_userland_csprng)

Opcache

  • Добавлен кэш опкода второго уровня, основанного на файлах (экспериментально — отключено по умолчанию). Для его включения, PHP должен быть настроен и собран с —enable-opcache-file, затем конфигурационная директива opcache.file_cache=<DIR> должна быть помещена в php.ini. Кэш второго уровня может увеличить производительность при перезапуске сервера или сброса SHM. Вдобавок возможно использовать файловый кэш совсем без SHM, используя opcache.file_cache_only=1 (это может быть полезно для общего хостинга) и отключение проверки соответствия файлового кэша для ускорения загрузки в ущерб безопасности, используя opcache.file_cache_consistency_checks=0.

OpenSSL

  • Добавлена контекстная опция "alpn_protocols" SSL, позволяющая шифровать потоки клиент/сервер для согласования альтернативных протоколов, использующих расширение ALPN TLS, когда собраны с OpenSSL 1.0.2 или новее. Информация о согласованных протоколов принимается через вывод stream_get_meta_data().

Reflection

  • Добавлен класс ReflectionGenerator (yield из Traces, текущего файла/строки и т.д.)
  • Добавлен класс ReflectionType для улучшенной поддержки объявлений функций новых типов и скалярных типов. Новые методы ReflectionParameter::getType() и ReflectionFunctionAbstract::getReturnType() оба возвращают экземпляр ReflectionType.

Поток:

  • Только для Windows была добавлена новая контекстная опция потока, позволяющая блокировать чтения по трубам. Для её включения используйте array("pipe" => array("blocking" => true)), когда создаёте потоковый контекст. Знайте, что эта опция при определённых обстоятельствах может стать причиной мёртвого запирания на буфере трубы. Тем не менее, она может быть полезной в некоторых сценариях CLI.

3. Изменения в модулях SAPI

FPM

  • Исправлена ошибка #65933 (Не может определить конфигурационные строки длиннее 1024 байт).
  • Listen = port теперь прослушивает на всех адресах (IPv6 и IPv4-mapped).

4. Устаревшая функциональность

Ядро

  • Конструкции в стиле PHP 4, когда имя конструктора точно такое же как и имя класса, теперь устарели.
  • Статические вызовы к нестатическим методам теперь устарели.

OpenSSL

  • Контекстная опция SSL "capture_session_meta" теперь устаревшая. Мета данные, касающиеся активного криптоалгоритма на потоке источника, теперь принимается через возвращаемый результат из from stream_get_meta_data().

5. Изменённые функции

parse_ini_file():

parse_ini_string():

  • Добавлен режим сканера INI_SCANNER_TYPED для набранных yield .ini значений.

unserialize():

  • Добавлен второй параметр для функции десериализации (RFC: https://wiki.php.net/rfc/secure_unserialize) позволяющие определить принимаемые классы: unserialize($foo, [«allowed_classes» => [«MyClass», «MyClass2»]]);

proc_open():

  • Максимальное количество труб, используемое proc_open(), раньше было ограничено жёстко заданным значением 16. Это ограничение теперь убрано и количество труб фактически ограничено количеством доступной для PHP памяти.
  • Только для Windows, новая опция "blocking_pipes" может быть использована для принудительной блокировки чтения на дочерних трубах процесса. Это охватывает несколько крайних случаев использования CLI, тем не менее, это может вести к мёртвым запираниям. Также это коррелирует с новыми контекстными опциями потока для труб.

array_column():

  • Эта функция теперь поддерживает массив объектов, а также двухмерные массивы. Рассматриваются только публичные свойства, а объекты, которые используют _get() для динамических свойств, должны также реализовывать __isset().

stream_context_create()

  • Теперь она принимает только конфигурацию Windows array("pipe" => array("blocking" => <boolean>)), что принудительно блокирует чтение на трубах. Эта опция должна использоваться осторожно, поскольку из-за ограничения этой платформы, возможны мёртвые запирания на буферах труб.

6. Новые функции

GMP

  • Добавлена Added gmp_random_seed().

PCRE:

  • Добавлена функция preg_replace_callback_array
    (RFC: https://wiki.php.net/rfc/preg_replace_callback_array)

Стандартные:

  • Добавлена функция intdiv() для целочисленного деления.
  • Добавлена функция error_clear_last() для сброса статуса ошибок.

Zlib:

  • Добавлены функции deflate_init(), deflate_add(), inflate_init(), inflate_add(), позволяющие инкрементное/потоковое сжатие/декомпрессию.

7. Новые классы и интерфейсы

8. Удалённые расширения и SAPI

  • sapi/aolserver
  • sapi/apache
  • sapi/apache_hooks
  • sapi/apache2filter
  • sapi/caudium
  • sapi/continuity
  • sapi/isapi
  • sapi/milter
  • sapi/nsapi
  • sapi/phttpd
  • sapi/pi3web
  • sapi/roxen
  • sapi/thttpd
  • sapi/tux
  • sapi/webjames
  • ext/mssql
  • ext/mysql
  • ext/sybase_ct
  • ext/ereg

Для дополнительных подробностей смотрите

https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts

https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7

ВНИМАНИЕ: по поводу NSAPI не голосовали в RFC, тем не менее, она была удалена. Это также означает, что соответствующий SDK больше недоступен.

9. Другие изменения в расширениях

Mhash

  • Mhash больше не является расширением, используйте функцию function_exists("mhash") для проверки, доступен ли он.

GD

  • Комплект libgd требует libwebp вместо libvpx для функциональности WebP.

10. Новые глобальные константы

Ядро

  • Добавлена PHP_INT_MIN.

Zlib

  • Эти константы добавлены для контроля поведения стирания с новыми инкрементными функциями deflate_add() и inflate_add():

    • ZLIB_NO_FLUSH
    • ZLIB_PARTIAL_FLUSH
    • ZLIB_SYNC_FLUSH
    • ZLIB_FULL_FLUSH
    • ZLIB_BLOCK
    • ZLIB_FINISH

GD

  • Поддержка T1Lib удалена, причиной этому стало появление новой зависимости для T1Lib. Следовательно, следующее больше недоступно:

Функции:

  • imagepsbbox()
  • imagepsencodefont()
  • imagepsextendedfont()
  • imagepsfreefont()
  • imagepsloadfont()
  • imagepsslantfont()
  • imagepstext()

Ресурсы:

  • 'шрифт gd PS'
  • 'кодировка gd PS'

11. Изменение в работе файла INI

Ядро

  • Удалена ini директива asp_tags. Попытка её включить вызовет фатальную ошибку.
  • Удалена ini директива always_populate_raw_post_data.

12. Поддержка Windows

Ядро

  • Поддержка нативных 64-битных чисел в 64-битных сборках.
  • Поддержка огромных файлов в 64-битных сборках.
  • Поддержка для getrusage()

ftp

  • Расширение ftp теперь всегда поставляется совместно
  • Для поддержки SSL была упразднена зависимость расширения openssl. Теперь поддержка SSL зависит только от библиотеки openssl. Если она присутствует во время компиляции, ftp_ssl_connect() включается автоматически.

odbc

  • Расширение odbc всегда поставляется совместно

13. Другие изменения

Ядро

  • Вместо того, чтобы быть неопределёнными и платформозависимыми, NaN и Infinity теперь всегда будут нулём, когда они применяются в роли целого числа.
  • Вызов метода не-объекта теперь вызывает перехватываемую ошибку вместо фатальной ошибки, смотрите https://wiki.php.net/rfc/catchable-call-to-member-of-non-object
  • Сообщения об ошибках zend_parse_parameters, нюансы с типами и приобразованиями теперь всегда говорят "integer" и "float" вместо "long" и "double".
  • Вывод буферизации теперь продолжает работу для прерванного соединения, если опция ignore_user_abort установлена в true.

Похожие темы

Проект Razboynik (Разбойник) https://codeby.net/forum/threads/razboynik.58364/ В этой публикации я хочу поделиться с вами информацией о проекте российских разработчиков. Про...
MiAl’s Server Pack (полностью настроенный и рабочи... 1. Описание MiAl’s Server Pack – это локальный сервер, сконфигурированный и готовый к работе. Для начала работы, требуется только распаковать и запуст...
Настройка защищённого VPS (VDS) на Debian. Часть п... Если вы не знаете, что такое VPS (VDS), то посмотрите здесь. Если вы знаете о VPS, но по какой-то причине у вас его ещё нет, то перейдите ...
PHPclasses – новые готовые решения каждый день для... Сегодня, не выходя за пределы PHP, мы с вами познакомимся с готовыми решениями для шифрования, распознавания лиц, работы с APK файлами, научимся созда...
Новости софта от 23 августа 2014 года (PHP, CKEdit... Буквально вчера обновились две линейки PHP. Новые версии имеют номера PHP 5.5.16 и PHP 5.4.32. Списки изменений доступны здесь и здесь. Скачать свеж...