クラスとオブジェクトの変更点
== 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
と abstract
とは決して両立することのない概念だからです。
インターフェイスのアクセス修飾子
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
エラーを発生させます。
<?phpclass 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
がスローされます。
<?phpclass test { const foobar = 'foo'; const foobar = 'bar';}?>