5.1.x
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';
}
?>