php-src/UPGRADING

521 lines
17 KiB
Plaintext
Raw Normal View History

$Id$
PHP X.Y UPGRADE NOTES
1. Backward Incompatible Changes
2. New Features
2014-05-01 10:27:38 +00:00
3. Changes in SAPI modules
4. Deprecated Functionality
5. Changed Functions
6. New Functions
7. New Classes and Interfaces
2015-02-10 07:56:18 +00:00
8. Removed Extensions and SAPIs
2014-05-01 10:27:38 +00:00
9. Other Changes to Extensions
10. New Global Constants
11. Changes to INI File Handling
2014-08-22 11:35:07 +00:00
12. Windows Support
13. Other Changes
2010-03-24 16:23:50 +00:00
2010-03-24 16:23:50 +00:00
========================================
1. Backward Incompatible Changes
2010-03-24 16:23:50 +00:00
========================================
2009-06-24 21:16:53 +00:00
Language changes
================
Changes to variable handling
----------------------------
* Indirect variable, property and method references are now interpreted with
left-to-right semantics. Some examples:
$$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz']
$foo->$bar['baz'] // interpreted as ($foo->$bar)['baz']
$foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']()
Foo::$bar['baz']() // interpreted as (Foo::$bar)['baz']()
To restore the previous behavior add explicit curly braces:
${$foo['bar']['baz']}
$foo->{$bar['baz']}
$foo->{$bar['baz']}()
Foo::{$bar['baz']}()
* The global keyword now only accepts simple variables. Instead of
global $$foo->bar;
it is now required to write the following:
global ${$foo->bar};
* Parentheses around variables or function calls no longer have any influence
on behavior. For example the following code, where the result of a function
call is passed to a by-reference function
function getArray() { return [1, 2, 3]; }
$last = array_pop(getArray());
// Strict Standards: Only variables should be passed by reference
$last = array_pop((getArray()));
// Strict Standards: Only variables should be passed by reference
will now throw a strict standards error irregardless of whether parentheses
are used. Previously no notice was generated in the second case.
* Array elements or object properties that are automatically created during
by-reference assignments will now result in a different order. For example
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
now results in the array ["a" => 1, "b" => 1], while previously the result
was ["b" => 1, "a" => 1];
Relevant RFCs:
* https://wiki.php.net/rfc/uniform_variable_syntax
* https://wiki.php.net/rfc/abstract_syntax_tree
Changes to list()
-----------------
* list() will no longer assign variables in reverse order. For example
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);
will now result in $array == [1, 2, 3] rather than [3, 2, 1]. Note that only
the **order** of the assignments changed, but the assigned values stay the
same. E.g. a normal usage like
list($a, $b, $c) = [1, 2, 3];
// $a = 1; $b = 2; $c = 3;
will retain its current behavior.
* Empty list() assignments are no longer allowed. As such all of the following
are invalid:
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
* list() no longer supports unpacking strings (while previously this was only
supported in some cases). The code
$string = "xy";
list($x, $y) = $string;
will now result in $x == null and $y == null (without notices) instead of
$x == "x" and $y == "y". Furthermore list() is now always guaranteed to
work with objects implementing ArrayAccess, e.g.
list($a, $b) = (object) new ArrayObject([0, 1]);
will now result in $a == 0 and $b == 1. Previously both $a and $b were null.
Relevant RFCs:
* https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list
* https://wiki.php.net/rfc/fix_list_behavior_inconsistency
Changes to foreach
------------------
* Iteration with foreach() no longer has any effect on the internal array
pointer, which can be accessed through the current()/next()/etc family of
functions. For example
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
will now print the value int(0) three times. Previously the output was int(1),
int(2) and bool(false).
* When iterating arrays by-value, foreach will now always operate on a copy of
the array, as such changes to the array during iteration will not influence
iteration behavior. For example
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
will now print all three elements (0 1 2), while previously the second element
1 was skipped (0 2).
* When iterating arrays by-reference, modifications to the array will continue
to influence the iteration. However PHP will now do a better job of
maintaining a correct position in a number of cases. E.g. appending to an
array during by-reference iteration
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
will now iterate over the appended element as well. As such the output of this
example will now be "int(0) int(1)", while previously it was only "int(0)".
* Iteration of plain (non-Traversable) objects by-value or by-reference will
behave like by-reference iteration of arrays. This matches the previous
behavior apart from the more accurate position management mentioned in the
previous point.
* Iteration of Traversable objects remains unchanged.
Relevant RFC: https://wiki.php.net/rfc/php7_foreach
Changes to parameter handling
-----------------------------
* It is no longer possible to define two function parameters with the same name.
For example, the following method will trigger a compile-time error:
public function foo($a, $b, $unused, $unused) {
// ...
}
Code like this should be changed to use distinct parameter names, for example:
public function foo($a, $b, $unused1, $unused2) {
// ...
}
* The func_get_arg() and func_get_args() functions will no longer return the
original value that was passed to a parameter and will instead provide the
current value (which might have been modified). For example
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);
will now print "2" instead of "1". This code should be changed to either
perform modifications only after calling func_get_arg(s)
function foo($x) {
var_dump(func_get_arg(0));
$x++;
}
or avoid modifying the parameters altogether:
function foo($x) {
$newX = $x + 1;
var_dump(func_get_arg(0));
}
* Similarly exception backtraces will no longer display the original value that
was passed to a function and show the modified value instead. For example
function foo($x) {
$x = 42;
throw new Exception;
}
foo("string");
will now result in the stack trace
Stack trace:
#0 file.php(4): foo(42)
#1 {main}
while previously it was:
Stack trace:
#0 file.php(4): foo('string')
#1 {main}
While this should not impact runtime behavior of your code, it is worthwhile
to be aware of this difference for debugging purposes.
The same limitation also applies to debug_backtrace() and other functions
inspecting function arguments.
Relevant RFC: https://wiki.php.net/phpng
2015-02-13 20:42:44 +00:00
Changes to integer handling
---------------------------
* Invalid octal literals (containing digits larger than 7) now produce compile
errors. For example, the following is no longer valid:
$i = 0781; // 8 is not a valid octal digit!
Previously the invalid digits (and any following valid digits) were simply
ignored. As such $i previously held the value 7, because the last two digits
were silently discarded.
* Bitwise shifts by negative numbers will now throw a warning and return false:
var_dump(1 >> -1); // bool(false)
// Warning: Bit shift by negative number
* Left bitwise shifts by a number of bits beyond the bit width of an integer
will always result in 0:
var_dump(1 << 64); // int(0)
Previously the behavior of this code was dependent on the used CPU
architecture. For example on x86 (including x86-64) the result was int(1),
because the shift operand was wrapped.
* Similarly right bitwise shifts by a number of bits beyond the bit width of an
integer will always result in 0 or -1 (depending on sign):
2015-02-13 20:42:44 +00:00
var_dump(1 >> 64); // int(0)
var_dump(-1 >> 64); // int(-1)
Relevant RFC: https://wiki.php.net/rfc/integer_semantics
Changes to string handling
--------------------------
2015-02-13 20:42:44 +00:00
* Strings that contain hexadecimal numbers are no longer considered to be
numeric and don't receive special treatment anymore. Some examples of the
new behavior:
2015-02-13 20:42:44 +00:00
var_dump("0x123" == "291"); // bool(false) (previously true)
var_dump(is_numeric("0x123")); // bool(false) (previously true)
var_dump("0xe" + "0x1"); // int(0) (previously 16)
var_dump(substr("foo", "0x1")); // string(3) "foo" (previously "oo")
// Notice: A non well formed numeric value encountered
filter_var() can be used to check if a string contains a hexadecimal number
or convert such a string into an integer:
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
throw new Exception("Invalid integer!");
}
var_dump($num); // int(65535)
* Due to the addition of the Unicode Codepoint Escape Syntax for double-quoted
strings and heredocs, "\u{" followed by an invalid sequence will now result in
an error:
$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
To avoid this the leading backslash should be escaped:
$str = "\\u{xyz}"; // Works fine
However, "\u" without a following { is unaffected. As such the following code
won't error and will work the same as before:
$str = "\u202e"; // Works fine
2015-02-13 20:42:44 +00:00
Relevant RFCs:
* https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings
* https://wiki.php.net/rfc/unicode_escape
Other language changes
----------------------
. Removed ASP (<%) and script (<script language=php>) tags.
(RFC: https://wiki.php.net/rfc/remove_alternative_php_tags)
2014-09-10 13:55:26 +00:00
. Removed support for assigning the result of new by reference.
. Removed support for scoped calls to non-static methods from an incompatible
$this context. See details in https://wiki.php.net/rfc/incompat_ctx.
. Removed support for #-style comments in ini files. Use ;-style comments
instead.
. $HTTP_RAW_POST_DATA is no longer available. Use the php://input stream instead.
Standard library changes
========================
. call_user_method() and call_user_method_array() no longer exists.
. ob_start() no longer issues an E_ERROR, but instead an E_RECOVERABLE_ERROR in case an
output buffer is created in an output buffer handler.
2015-01-14 09:22:58 +00:00
. Added hybrid sorting algo zend_sort for better performance.
. Added stable sorting algo zend_insert_sort.
2014-09-11 11:03:58 +00:00
. Removed dl() function on fpm-fcgi.
2014-09-20 23:47:25 +00:00
Other
=====
- Date:
. Removed $is_dst parameter from mktime() and gmmktime().
2013-12-05 10:30:52 +00:00
- DBA
. dba_delete() now returns false if the key was not found for the inifile
2013-12-05 10:30:52 +00:00
handler, too.
- GMP
. Requires libgmp version 4.2 or newer now.
. gmp_setbit() and gmp_clrbit() now return FALSE for negative indices, making
them consistent with other GMP functions.
- Session
. session_start() accepts all INI settings as array. e.g. ['cache_limiter'=>'private']
sets session.cache_limiter=private. It also supports 'read_and_close' which closes
session data immediately after read data.
2015-01-26 01:24:12 +00:00
. Save handler accepts validate_sid(), update_timestamp() which validates session
ID existence, updates timestamp of session data. Compatibility of old user defined
save handler is retained.
. SessionUpdateTimestampHandlerInterface is added. validateSid(), updateTimestamp()
is defined in the interface.
. session.lazy_write(default=On) INI setting enables only write session data when
session data is updated.
- OpenSSL:
. Removed the "rsa_key_size" SSL context option in favor of automatically
setting the appropriate size given the negotiated crypto algorithm.
2014-09-10 15:19:02 +00:00
- PCRE:
. Removed support for /e (PREG_REPLACE_EVAL) modifier. Use
preg_reaplace_callback() instead.
- Standard:
. Removed string category support in setlocale(). Use the LC_* constants
instead.
. Removed set_magic_quotes_runtime() and its alias magic_quotes_runtime().
- JSON:
. Rejected RFC 7159 incompatible number formats in json_decode string -
top level (07, 0xff, .1, -.1) and all levels ([1.], [1.e1])
. Calling json_decode with 1st argument equal to empty PHP string or value that
after casting to string is empty string (NULL, FALSE) results in JSON syntax error.
2014-09-10 15:31:37 +00:00
- Stream:
. Removed set_socket_blocking() in favor of its alias stream_set_blocking().
========================================
2. New Features
========================================
2014-08-22 11:35:07 +00:00
- Core
2014-12-15 07:49:24 +00:00
. Added null coalesce operator (??).
(RFC: https://wiki.php.net/rfc/isset_ternary)
2014-12-21 03:08:29 +00:00
. Support for strings with length >= 2^31 bytes in 64 bit builds.
. Closure::call() method added.
2014-12-19 01:06:46 +00:00
. Added \u{xxxxxx} Unicode Codepoint Escape Syntax for double-quoted strings
and heredocs.
2014-12-21 03:08:29 +00:00
. define() now supports arrays as constant values, fixing an oversight where define() did not support arrays yet const syntax did.
2015-02-19 22:02:04 +00:00
. Added the comparison operator (<=>), aka the spaceship operator.
(RFC: https://wiki.php.net/rfc/combined-comparison-operator)
2014-08-22 11:35:07 +00:00
- OpenSSL
. Added "alpn_protocols" SSL context option allowing encrypted client/server
streams to negotiate alternative protocols using the ALPN TLS extension when
built against OpenSSL 1.0.2 or newer. Negotiated protocol information is
accessible by passing streams to the new stream_socket_crypto_info().
========================================
2014-05-01 10:27:38 +00:00
3. Changes in SAPI modules
========================================
2014-08-19 23:38:33 +00:00
- FPM
. Fixed bug #65933 (Cannot specify config lines longer than 1024 bytes).
. Listen = port now listen on all addresses (IPv6 and IPv4-mapped).
========================================
2014-05-01 10:27:38 +00:00
4. Deprecated Functionality
========================================
========================================
2014-05-01 10:27:38 +00:00
5. Changed Functions
========================================
2009-06-23 19:40:31 +00:00
2014-09-01 14:30:09 +00:00
- parse_ini_file():
- parse_ini_string():
2014-12-21 03:08:29 +00:00
. Added scanner mode INI_SCANNER_TYPED to yield typed .ini values.
2014-11-23 06:23:55 +00:00
- unserialize():
2014-12-21 03:08:29 +00:00
. Added second parameter for unserialize function
(RFC: https://wiki.php.net/rfc/secure_unserialize) allowing to specify
acceptable classes:
unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
2014-09-01 14:30:09 +00:00
========================================
2014-05-01 10:27:38 +00:00
6. New Functions
========================================
- GMP
. Added gmp_random_seed().
- Standard
. Added intdiv() function for integer division.
2013-11-04 12:32:45 +00:00
- Stream:
. Added stream_socket_crypto_info() allowing inspection of negotiated TLS
connection properties
========================================
2014-05-01 10:27:38 +00:00
7. New Classes and Interfaces
========================================
========================================
2015-02-10 07:56:18 +00:00
8. Removed Extensions and SAPIs
========================================
2015-02-10 07:56:18 +00:00
- sapi/aolserver
- sapi/apache
- sapi/apache_hooks
- sapi/apache2filter
- sapi/caudium
- sapi/continuity
- sapi/isapi
- sapi/milter
- sapi/phttpd
- sapi/pi3web
- sapi/roxen
- sapi/thttpd
- sapi/tux
- sapi/webjames
- ext/mssql
- ext/sybase_ct
For more details see https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts
========================================
2014-05-01 10:27:38 +00:00
9. Other Changes to Extensions
========================================
========================================
2014-05-01 10:27:38 +00:00
10. New Global Constants
========================================
2010-03-24 16:23:50 +00:00
2014-08-01 15:28:20 +00:00
- Core
2014-08-06 18:56:32 +00:00
. PHP_INT_MIN added.
2010-03-24 16:23:50 +00:00
========================================
2014-05-01 10:27:38 +00:00
11. Changes to INI File Handling
========================================
- Core
. Removed asp_tags ini directive. Trying to enable it will result in a fatal
error.
2015-02-04 09:22:52 +00:00
. Removed always_populate_raw_post_data ini directive.
2014-08-22 11:35:07 +00:00
========================================
12. Windows Support
========================================
- Core
2014-12-21 03:08:29 +00:00
. Support for native 64 bit integers in 64 bit builds.
. Support for large files in 64 bit builds.
========================================
2014-08-22 11:35:07 +00:00
13. Other Changes
========================================
2014-09-20 23:47:25 +00:00
- Core
. Instead of being undefined and platform-dependent, NaN and Infinity will
2014-09-20 23:47:25 +00:00
always be zero when casted to integer.
. Calling a method on a non-object no longer raises a fatal error; see
2014-12-21 03:08:29 +00:00
also: https://wiki.php.net/rfc/catchable-call-to-member-of-non-object.
. Error messages for zend_parse_parameters, type hints and conversions now always say "integer" and "float" instead of "long" and "double".