• Migrating from PHP 4 to PHP
  • Backward Incompatible Changes

  • Backward Incompatible Changes
  • Backward Incompatible Changes

    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
    • 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[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 emitting
      E_WARNING out of the
    • 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/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 >=
    • 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
    • $_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
      __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
    • 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

    Example #1 strrpos() and
    strripos() now use the entire string as a

    (strrpos('ABCDEF','DEF')); //int(3)

    var_dump(strrpos('ABCDEF','DAF')); //bool(false)

    Example #2 An object with no properties is no longer
    considered “empty”

    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


    //works with no errors:
    $a = new a();

    //throws an error:
    $a = new b();

    interface c{
    implements {