クラスとオブジェクトの変更点

instanceof, is_a(), is_subclass_of() および catch

PHP 5.0 で is_a() は非推奨となり、"instanceof" 演算子に置き換えられました。 "instanceof# の初期の実装にはいくつかの問題があり、クラスを探すために __autoload() に頼っていました。もしクラスが存在しなかった場合、 __autoload() に失敗するために "instanceof" は致命的な E_ERROR をスローしていました。 同じ理由で、"catch" 演算子や is_subclass_of() 関数でも同様の現象が発生していました。

PHP 5.1 では、これらの関数や演算子は __autoload() をコールしません。 また、PHP 5.0.x ではこの問題の回避策として class_exists() が使用可能です。 大きな問題ではありませんが、この回避策はもはや必要ありません。

抽象 private メソッド

PHP 5.0.0 から PHP 5.0.4 まででは抽象 private メソッドがサポートされていましたが、 これは禁止されました。なぜなら「private」と「抽象メソッド」 とは決して両立することのない概念だからです。

インターフェイスのアクセス修飾子

PHP 5.0 では、インターフェイス内での関数定義はクラス内での関数定義と同じように扱われました。 2004 年 10 月以降はそうではなくなり、インターフェイス内での関数定義では 「public」以外のアクセス修飾子を指定できなくなりました。 そして 2005 年 4 月、PHP 5.0b1 のリリース前に、「static」 修飾子も許可されるようになりました。しかし、「protected」修飾子や 「private」修飾子を指定しようとすると E_ERROR をスローします。 「abstract」も同様です。この変更が既存のコードに影響を及ぼすことはないはずです。 結局のところ、インターフェイス内でこれら (protected, private, abstract) を指定してもそれは意味のないものだからです。

継承規則の変更

PHP 5.0 では、基底クラスの同名の関数定義と一致しない関数を 派生クラスの中で定義することが可能でした。たとえば以下のようなものです。

PHP 5.1.x では、このコードは E_STRICT エラーを発生させます。

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

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

クラス定数

PHP 5.0.x では、以下のコードは正しいものでした。

PHP 5.1.x では、クラス定数を再定義すると、致命的なエラー E_ERROR がスローされます。

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

?>