BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Register Globals を廃止して Trait を加えた PHP 5.4

Register Globals を廃止して Trait を加えた PHP 5.4

ブックマーク

原文(投稿日:2012/03/09)へのリンク

PHP 5.4 の開発が今月完了した。2009 年以来のメジャーアップデートである。今回のリリースには Trait サポートなどの言語拡張が含まれると同時に,論議の的であったいくつかの機能が削除されている。

Trait

PHP は Java や .NET と同じ単一継承モデルを採用している。ほとんどの場合はこれで十分だが,共通したコーディングパターンを,関連のないクラスで繰り返さなくてはならない場合もある。(.NET の Dispose メソッド などは, この種のボイラプレートコードの好例だ)。これに対処するため,PHP 5.4 では Trait を提供する。

Trait は,特定のクラスに属さないメソッドの集合だ。インスタンスを生成したり,メソッドを直接呼び出したりすることはできない。Trait は実際のクラスに組み込まなければ使用できないのだ。優先順位の面では,Trait のメソッドは継承メソッドをオーバーライドするが,現在のクラス内で宣言されたメソッドは Trait のメソッドをさらにオーバーライドする。

Trait 同士の優先順位は同じなので,同じクラスにメソッド名の重複する2つの Trait を使用した場合,デフォルトではエラーになる。しかし "insteadof" と "as" 演算子を使用してコンフリクトを解決するように記述すれば,このエラーを回避することができる。"as" 演算子は Trait の可視性を変更することも可能だ。

Trait メソッドは抽象メソッドにすることもできる。Trait を部分的に汎化したい場合には有効な方法だ。Trait で static 変数を公開することもできるが,各クラスが独自のコピーを保持することになる。Trait で宣言されたプロパティは,それを使用するクラス内で宣言することはできない。

その他の構文改良

その他の構文改良としては,次のようなものがある。

  • "array" 関数の代わりに角括弧で配列を宣言できるようになった。多少簡潔になったが,それだけのものだ。
  • 配列の間接参照を関数の戻り値として使用できるようになった。これまでは最初にテンポラリ変数に設定する必要があった: $FirstName = GetNames()[0]
  • PHP 5.4 のクロージャでは,従来は許されていなかった "$this" ポインタが使用できるようになった。
  • インスタンス生成からのクラスメンバへのアクセスが可能になった:(new CustomerService)->Delete(customerId)
  • "0b" プレフィックスを使用するバイナリ数値。

コマンドライン Web サーバ

PHP 5.4 には独自の web サーバ があり,コマンドラインから起動することができる。開発のみを目的として設計されたもので,実運用中の web サーバを置き換えるものではない。

非推奨機能

極めて有害な Register Globals 機能が PHP から完全に取り除かれた。この機能は 10 年以上前から,セキュリティ上の脆弱性の根源として広く認知されていて,2002 年にはデフォルトでオフにされたものだ。2009 年にリリースされた PHP 5.3 では非推奨の機能となっていたが,大部分の開発者はそれより以前から使用を止めていた。

PHP から取り除かれた,もうひとつの不人気な機能は Magic Quotes だ。元々は SQL インジェクション攻撃を回避するための試みとして,文字列のエスケープを自動的に試みるものだった。しかし文字列をエスケープする方法と使い方がコンテキスト依存であったために,問題解決よりもかえって多くの問題を発生させていた。Register Globals と同じく,この機能も 2009 年からは非推奨とされていた。

PHP の breakcontinue では,ループを抜け出すレベルをパラメータとして指定することができる。指定されない場合は VB や C#,Java などと同じように,もっとも内側のループから抜け出す。PHP 5.4 以前は break に変数を渡すことが許されていたが,これが定数を必要とするように変更された。

PHP では引数を参照渡しすることができる。従来のバージョンでは,変数の参照渡しをコール側で修飾することが可能だった。しかし PHP 5.4 では,このオプションが廃止されている。代わりに現在の PHP プログラムでは,関数を宣言する側で参照渡しを示す必要がある。C# とは異なり,宣言と呼び出し側の両方で指定をする必要はない。

この記事に星をつける

おすすめ度
スタイル

BT