Although most existing PHP 4 code should work without changes, you should
pay attention to the following backward incompatible changes:
There are some new reserved
strrpos() and strripos() now use
the entire string as a needle.
Illegal use of string offsets causes E_ERROR instead
of E_WARNING. An example illegal use is:
$str = 'abc'; unset($str);.
array_merge() was changed to accept only arrays. If a
non-array variable is passed, a E_WARNING will be
thrown for every such parameter. Be careful because your code may start
emitting E_WARNING out of the blue.
PATH_TRANSLATED server variable is no longer set implicitly under
Apache2 SAPI in contrast to the situation in PHP 4, where it is set to
the same value as the SCRIPT_FILENAME server variable when it is not
populated by Apache. This change was made to comply with the CGI specification. Please refer to bug #23610 for further information,
and see also the
$_SERVER['PATH_TRANSLATED'] description in the manual. This issue
also affects PHP versions >= 4.3.2.
The T_ML_COMMENT constant is no longer defined by
the Tokenizer extension. If
error_reporting is set to E_ALL, PHP will
generate a notice. Although the T_ML_COMMENT was
never used at all, it was defined in PHP 4. In both PHP 4 and PHP 5
// and /* */ are resolved as the T_COMMENT
constant. However the PHPDoc style comments /** */, which starting PHP
5 are parsed by PHP, are recognized as T_DOC_COMMENT.
$_SERVER should be populated with argc and argv if variables_order includes "S". If
you have specifically configured your system to not create $_SERVER,
then of course it shouldn't be there. The change was to always make argc
and argv available in the CLI version regardless of the variables_order setting. As in,
the CLI version will now always populate the global $argc and $argv
An object with no properties is no longer considered "empty".
In some cases classes must be declared before use. It only happens if
some of the new features of PHP 5 (such as interfaces) are used.
Otherwise the behaviour is the old.
and get_class_methods() now return the name of the
classes/methods as they were declared (case-sensitive) which may lead to
problems in older scripts that rely on the previous behaviour (the
class/method name was always returned lowercased). A possible solution
is to search for those functions in all your scripts and use
This case sensitivity change also applies to the
__METHOD__, and __FUNCTION__.
The values are returned exactly as they're declared (case-sensitive).
ip2long() now returns FALSE when an invalid IP
address is passed as argument to the function, and no longer
If there are functions defined in the included file, they can be used in the
main file independent if they are before return() or after.
If the file is included twice, PHP 5 issues fatal error because functions
were already declared, while PHP 4 doesn't complain about it.
It is recommended to use include_once() instead of
checking if the file was already included and conditionally return inside
the included file.
include_once() and require_once()
first normalize the path of included file on Windows so that including
A.php and a.php include the file just once.