migration51-php-oop-3

  • Migrating from PHP 5.0.x to PHP
    5.1.x
  • Class and object changes

  • Class and object changes
  • Class and object changes

    Class and object changes

    instanceof, is_a(),
    is_subclass_of() and catch

    In PHP 5.0, is_a() was deprecated and
    replaced by the instanceof operator. There were some
    issues with the initial implementation of instanceof,
    which relied on __autoload() to search for missing
    classes. If the class was not present, instanceof would
    throw a fatal E_ERROR due to the
    failure of __autoload() to discover that class. The same
    behaviour occurred in the catch operator and the
    is_subclass_of() function, for the same reason.

    None of these functions or operators call
    __autoload() in PHP 5.1.x, and the class_exists()
    workarounds used in code written for PHP 5.0.x, while not
    problematic in any way, are no longer necessary.

    Abstract private methods

    Abstract private methods were supported between PHP
    5.0.0 and PHP 5.0.4, but were then disallowed on the grounds that
    the behaviours of private and abstract are
    mutually exclusive.

    Access modifiers in interfaces

    Under PHP 5.0, function declarations in interfaces
    were treated in exactly the same way as function declarations in
    classes. This has not been the case since October 2004, at which
    point only the public access modifier was allowed in
    interface function declarations. Since April 2005 – which pre-dates
    the PHP 5.0b1 release – the static modifier has also been
    allowed. However, the protected and private
    modifiers will now throw an E_ERROR,
    as will abstract. Note that this change should not affect
    your existing code, as none of these modifiers makes sense in the
    context of interfaces anyway.

    Changes in inheritance rules

    Under PHP 5.0, it was possible to have a function
    declaration in a derived class that did not match the declaration
    of the same function in the base class, e.g.

    This code will cause an
    E_STRICT error to be emitted under
    PHP 5.1.x.

    <?php
    class Base {
        function &
    return_by_ref() {
            
    $r 1;
            return 
    $r;
        }
    }

    class Derived extends Base {
        function 
    return_by_ref() {
            return 
    1;
        }
    }
    ?>

    Class constants

    Under PHP 5.0.x, the following code was valid:

    Under PHP 5.1.x, redefinition of a class constant
    will throw a fatal E_ERROR.

    <?php
    class test {
        const 
    foobar 'foo';
        const 
    foobar 'bar';
    }

    ?>