PHP5 では、メインエンジンが ZendEngine2 に変更され、より Java ライクな言語に変わりました。それが良いのか悪いのかはこの際置いておくとして、近い将来の以降のために PHP4 と PHP5 の違いをまとめてみます。
以下は phpspot さんの情報に抜粋、加筆したものです。
- オブジェクトのコピー方法の変更
- メンバ変数、メンバ関数のアクセス制限
- interfaceのサポート
- abstract なクラス、メソッド
- final 修飾子のサポート
- 名前空間のサポート
- クラスタイプヒント
- クラス内での定数
- static なメンバ
- $this の仕様変更
- コンストラクタ名の統一
- デストラクタのサポート
- 存在しないクラスを自動読み込み
- アクセサという仕組み
- 例外処理
- デバッグ機能の強化
- __toString() で文字列に
“public”・”private”・”protected”の修飾子が使えるようになりました。
なお、PHP4 で使用していたクラスのプロパティの修飾子である”var”は推奨されないそうです。
アクセス修飾子を省略した場合は、デフォルトで public になります。
Java でおなじみの interface が使用できるようになりました。
あるインタフェースを実装する、というルールを明確に記述することができ、実装のし忘れを防ぎます。
abstract とは、「抽象的な、観念的な、理論的な、非現実的な」という意味ですが、
まさにそういう感じで、定義した時点では使えないクラスを定義することができます。
クラスの場合、このクラスは継承できない、というルールを指定したい場合に使われます。
メソッドの場合、メソッドを子クラスで上書き(オーバーライド)できないというルールを指定したい場合に使われます。
大規模開発などで、短い名前のクラスを定義してしまうと、かぶってしまう可能性がありますが、名前空間を定義できることによって、これを防ぐことができます。
このメソッドにはこのクラスのインスタンスしか渡したくない、という場合にそれを定義できるようになりました。
PHP4 までは define での定数定義しかできませんでしたが、PHP5 ではクラス内で const が使えるようになりました。
static とすることで、クラスをインスタンス化しないでも変数を入れておけるようになりました。また、インスタンスを生成しないでメソッドを呼び出す場合には、static を付けないと警告が出るようになります。
PHP4 で、$this に対する代入によって、他のオブジェクトを代入出来ていましたが、これが出来なくなりました。ま、私はあんまりこんなことはしないので、あまり関係ないですが。。。
PHP4 ではコンストラクタ名はクラス名と同じのfunctionを定義していましたが、PHP5 では __construct というメソッドを定義することでコンストラクタとします。PHP4 で使えた、クラス名と同名のメンバ関数をコンストラクタとすることも可能ですが、__construct が定義されていた場合、そちらを優先することになっています。
PHP4 では存在しなかったデストラクタですが、PHP5 ではデストラクタが存在します。終了時に何らかの処理をオブジェクトごとに行いたい(ログなどを吐き出したい場合)などに重宝します。コンストラクタ同様に、親クラスのデストラクタが自動で呼ばれることはないので、呼び出す必要がある場合は、自クラスの __destract() 内で明示的に呼び出す必要があります。
PHP4 では、使うクラスは予め include などをして読み込んでおかないと使えませんでした。これは、実際の処理では使われないクラスもパーシングされてしまうので、インタプリタで動作する PHP では処理速度に影響が出てきてしまいます。しかし、PHP5 では、存在しないクラスを呼び出そうとしたときには、__autoload() を呼び出して読み込む、ということが出来るようになります。
PHP5 では、存在しないメンバ変数に変更を加えようとした際に自動的に呼ばれる __set()/__get() メソッドが追加されました。この機能により、__set() にて、加工した値をメンバに自動的に挿入といったことが出来るようになります。また、存在しないメンバ関数を呼び出そうとした際に呼ばれる __call() というメソッドも存在します。
Java 同様の try catch 文が使えるようになりました。
debug_backtrace() という関数が実装されました。
クラスにマジックメソッドである __toString() を定義しておくと、オブジェクトの文字列への変換処理をオーバーロードすることが出来ます。この自動変換処理は表示系関数(echo, print, *printf)に対してのみ行われ、文字列を期待する関数に対しては行われません。オブジェクトをシリアライズしたり、文字列化する場合にこの関数を定義しておくと便利です。