Backward Incompatible Changes
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 keywords.
- strrpos() and strripos() now use the entire string as a needle.
-
Illegal use of string offsets causes
E_ERROR
instead ofE_WARNING
. An example illegal use is: $str = 'abc'; unset($str[0]);. -
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 emittingE_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 theSCRIPT_FILENAME
server variable when it is not populated by Apache. This change was made to comply with the » CGI/1.1 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 toE_ALL
, PHP will generate a notice. Although theT_ML_COMMENT
was never used at all, it was defined in PHP 4. In both PHP 4 and PHP 5 // and /* */ are resolved as theT_COMMENT
constant. However the PHPDoc style comments /** */, which starting PHP 5 are parsed by PHP, are recognized asT_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 variables.
- 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.
-
get_class(), get_parent_class()
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
strtolower().
This case sensitivity change also applies to the
magical predefined
constants
__CLASS__
,__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 -1. - 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.
- Passing an array to a function by value no longer resets the array's internal pointer for array accesses made within the function. In other words, in PHP 4 when you passed an array to a function, its internal pointer inside the function would be reset, while in PHP 5, when you pass an array to a function, its array pointer within the function will be wherever it was when the array was passed to the function.
Example #1 strrpos() and strripos() now use the entire string as a needle
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example #2 An object with no properties is no longer considered "empty"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Will be executed
}
?>
Example #3 In some cases classes must be declared before used
<?php
//works with no errors:
$a = new a();
class a {
}
//throws an error:
$a = new b();
interface c{
}
class b implements c {
}
?>
English translation
You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.
Thank you in advance.
Document created the 30/01/2003, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/php-rf-migration5.incompatible.html
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.
References
These references and links indicate documents consulted during the writing of this page, or which may provide additional information, but the authors of these sources can not be held responsible for the content of this page.
The author This site is solely responsible for the way in which the various concepts, and the freedoms that are taken with the reference works, are presented here. Remember that you must cross multiple source information to reduce the risk of errors.