PHP 7.1 UPGRADE NOTES 1. Backward Incompatible Changes 2. New Features 3. Changes in SAPI modules 4. Deprecated Functionality 5. Changed Functions 6. New Functions 7. New Classes and Interfaces 8. Removed Extensions and SAPIs 9. Other Changes to Extensions 10. New Global Constants 11. Changes to INI File Handling 12. Windows Support 13. Other Changes ======================================== 1. Backward Incompatible Changes ======================================== - Core: . 'void' can no longer be used as the name of a class, interface, or trait. This applies to declarations, class_alias() and use statements. . (int), intval() where $base is 10 or unspecified, settype(), decbin(), decoct(), dechex(), integer operators and other conversions now always respect scientific notation in numeric strings. (RFC: https://wiki.php.net/rfc/invalid_strings_in_arithmetic) . The ASCII 0x7F Delete control character is no longer permitted in unquoted identifiers in source code. . The following functions may no longer be called dynamically using $func(), call_user_func(), array_map() or similar: . extract() . compact() . get_defined_vars() . func_get_args() . func_get_arg() . func_num_args() . parse_str() with one argument . mb_parse_str() with one argument . assert() with a string argument (RFC: https://wiki.php.net/rfc/forbid_dynamic_scope_introspection) . If the error_log 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 loggged with the notice level only. - JSON: . An empty key is decoded as an empty property name instead of using _empty_ property name when decoding object to stdClass. . When calling json_encode with JSON_UNESCAPED_UNICODE option, U+2028 and U+2029 are escaped. ======================================== 2. New Features ======================================== - Core . Added void return type, which requires that a function not return a value. (RFC: https://wiki.php.net/rfc/void_return_type) . String offset access now supports negative references, which will be counted from the end of the string. (RFC: https://wiki.php.net/rfc/negative-string-offsets) . Added a form of the list() construct where keys can be specified. (RFC: https://wiki.php.net/rfc/list_keys) . Added [] = as alternative construct to list() =. (RFC: https://wiki.php.net/rfc/short_list_syntax) . Number operators taking numeric strings now emit "A non well formed numeric value encountered" E_NOTICEs for leading-numeric strings, and "A non-numeric value encountered" E_WARNINGs for non-numeric strings. This always applies to the +, -, *, /, **, %, << and >> operators, and their assignment counterparts +=, -=, *=, /=, **=, %=, <<= and >>=. For the bitwise operators |, & and ^, and their assignment counterparts |=, &= and ^=, this only applies where only one operand is a string. Note that this never applies to the bitwise NOT operator, ~, which does not handle numeric strings, nor to the increment and decrement operators ++ and --, which have a unique approach to handling numeric strings. (RFC: https://wiki.php.net/rfc/invalid_strings_in_arithmetic) ======================================== 3. Changes in SAPI modules ======================================== ======================================== 4. Deprecated Functionality ======================================== ======================================== 5. Changed Functions ======================================== - get_headers() has an extra parameter which allows passing a custom stream context. - The first $varname argument for getenv() is no longer mandatory, the current environment variables will be returned as an associative array when omitted. - json_encode() accepts new option JSON_UNESCAPED_LINE_TERMINATORS that disables escaping of U+2028 and U+2029 characters when JSON_UNESCAPED_UNICODE is supplied. - long2ip() accepts integer as parameter now - pg_last_notice() accepts optional long parameter to specify operation. PGSQL_NOTICE_LAST - Get last notice (Default) PGSQL_NOTICE_ALL - Get all stored notices PGSQL_NOTICE_CLEAR - Remove all stored notices It returns empty string or array on successful PGSQL_NOTICE_LAST/ALL calls. It returned FALSE for empty notice previously. - pg_fetch_all() accepts 2nd optional result type parameter like pg_fetch_row(). - pg_select() accepts 4th optional result type parameter like pg_fetch_row(). - parse_url() is more restrictive now and supports RFC3986. - unpack() accepts an additional optional $offset argument. '@' format code (that specifes an absolute position) is applyed to input data after the $offset argument. - strpos(), stripos(), substr_count(), grapheme_strpos(), grapheme_stripos(), grapheme_extract(), iconv_strpos(), mb_strimwidth(), mb_ereg_search_setpos(), mb_strpos() and mb_stripos() now accept negative string offsets. - substr_count() and mb_strimwidth() additionally also accept negative length. - file_get_contents() accepts a negative seek offset if the stream is seekable. - tempnam() throws a notice when failing back to the system temp dir. ======================================== 6. New Functions ======================================== - Core: . Added sapi_windows_cp_set(), sapi_windows_cp_get(), sapi_windows_cp_is_utf8(), sapi_windows_cp_conv() for codepage handling. ======================================== 7. New Classes and Interfaces ======================================== ======================================== 8. Removed Extensions and SAPIs ======================================== ======================================== 9. Other Changes to Extensions ======================================== - SQLite3: . Upgraded bundled SQLite lib to 3.13.0 ======================================== 10. New Global Constants ======================================== - JSON: . JSON_UNESCAPED_LINE_TERMINATORS - Pgsql: PGSQL_NOTICE_LAST PGSQL_NOTICE_ALL PGSQL_NOTICE_CLEAR ======================================== 11. Changes to INI File Handling ======================================== ======================================== 12. Windows Support ======================================== - Core: . Support for long and UTF-8 path; If an 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 itroduced: - 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. 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. The recommended way to handle file paths, I/O and other related topics is by utilizing UTF-8. . Support for ftok() - FCGI . PHP_FCGI_CHILDREN is respected. If this environment variable is defined, the first php-fcgi.exe process will exec the specified number of children. Those will share the same TCP socket. - readline: . The readline extension is supported through the WinEditLine library (http://mingweditline.sourceforge.net/). Thereby, the interactive CLI shell is supported as well (php.exe -a). It is well known, but nevertheless is worth mentioning again, that the readline extension is not thread safe and will never be. Thus, the usage of it with any true thread safe SAPI (like Apache mod_winnt) is strongely discouraged. ======================================== 13. Other Changes ========================================