オブジェクト指向言語に生まれ変わるPHP5[後編]
PHP5の新機能とPHP4との互換性
小山 哲志
2003/5/27
クラス以外の拡張機能
クラスに関する拡張機能は大体こんなところだ。それでは、クラス以外に拡張された機能についても述べておこう。
■引数が参照の場合のデフォルト値
「配列を書き戻したい」など、関数の引数を参照で受け取りたい場合がたまにあるが、PHP4では参照で渡された引数にデフォルト値を設定することができなかった。
PHP5では、参照の引数に対してもデフォルト値を設定できる。なお、オブジェクトが引数の場合は、前編で書いたとおり「&」を付けなくても参照渡しになるので気にする必要はない。
<?php |
■__autoload()
存在しないクラスを使用するプログラムを記述した場合、通常ならエラーになって終了するだけだ。しかし、__autoload()という関数が存在すると、エラーになる前にその関数が呼ばれる。__autoload()内では、include_onceなどでそのクラスの定義ファイルを読み込むようにしておけば、エラーになることなく処理は続行される。
大規模なPHPサイトでは、1回の実行に非常に多くのファイルを読み込むことになるのが宿命だが、必要なクラスのみ読み込んで負荷を軽くする仕掛けとして、__autoloadは面白いかもしれない。
<?php |
■例外処理
プログラミングにエラー処理は避けて通れない事項だ。とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。その煩雑さを回避するため、文法として例外処理を持っている言語もある。PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。ただし上記の2言語と異なり、PHP5の例外機構ではオブジェクトしか投げることができない。また、例外をcatch{}で受け取る際は、型指定の柔軟なPHPでは珍しく、受け取る例外オブジェクトのクラスを指定する必要がある。これは多分、複数のcatch{}をサポートするには、型指定が避けられないためだろう。
なお、例外処理のサポートによりtry、throw、catchの3語は予約語になった。これらの単語をすでに使用している場合は修正が必要になる。
<?php |
■バックトレース
PHP-4.3.0から、debug_backtrace関数という機能がサポートされた。これはZend Engine 2.0(以下ZE2)で開発されたものだが、非常に有用だということでPHP4にバックポートされたのだ。これを用いると、その時点での関数の呼び出し履歴情報を取得できる。
詳しくは、
現在のPHPマニュアルhttp://www.php.net/manual/ja/function.debug-backtrace.php
を参照してほしい。
PHP4との互換性
気になるPHP4との互換性だが、従来の文法が大きく変わるのは前編で述べた「オブジェクトの代入が参照になること」くらいで、後はおおむね上位互換が保たれている。この記事で紹介したように、予約語がいくつか追加されており、これを定数や関数、クラスなどに使用していた場合は修正が必要となる。
追加された予約語: |
public、protected、private abstract、interface、implements final、namespace、import、const try、throw、catch |
オブジェクト機能についても、筆者の手元のクラスのいくつかを試してみたところ問題なく動作したが、すべてこうとはいかないようだ。例えば、pearコマンド(PEARの管理コマンドだが、それ自体もPHPで記述されている)は、現時点のPHP5ではうまく動作しなかった。pearコマンドならびにPEARフレームワークは、PHP4のオブジェクト機能をフルに活用しているので、ある意味動かなくなっても当然かもしれない(笑)。
仕様の微妙な変更は、PHP5の正式リリースに向けて今後何回も繰り返されるはずなので、現時点で互換性をうんぬんしても仕方ないだろう。PHP4正式リリースの際のように、前バージョンとの細かい非互換点は明確に告知されることを期待しよう。
まとめ
2回にわたりPHP5の拡張された言語仕様を解説したが、いかがだっただろうか。PHP4で大規模サイトの構築経験をお持ちの方なら、PHP4で不満だった点がPHP5で改善されているのを、いくつか見ることができるのではないかと思う。
もしPHP5を実験的に動かしてみたいという方がいたら、開発中のPHP5のソースツリーがcvs.php.netからanonymous CVSで取得(注)できるので、ぜひ試してみていただきたい。
【注】 cvs.php.netからCVSを用いてソースコードを取得する方法は、http://www.php.net/anoncvs.php (英語)を参照のこと。 |
PHP5はリリースされたらそれで終わりというわけではなく、各種extensionの対応やPEARなどクラスフレームワークの新機能への対応など、考えなければいけない問題がいろいろひかえている。PHP5の本格普及は、PHP4のときよりも大変かもしれない。しかし、このようなデメリットを考慮に入れたうえでも、PHP5にはそれに勝る魅力があるのではと筆者は考えている。正式リリースが楽しみだ。
2/2 |
Index | |
PHP5の新機能とPHP4との互換性 | |
Page1 PHP5のリリーススケジュール PHP5の新機能(クラス関係の続き) 名前空間 クラス内定数 クラス変数 統一コンストラクタ デストラクタ アクセサ |
|
Page2 クラス以外の拡張機能 引数が参照の場合のデフォルト値 __autoload() 例外処理 そのほか PHP4との互換性 まとめ |
オブジェクト指向言語に生まれ変わるPHP5 |
PHP関連記事 |
例外処理の実装を把握する PHP5で広がる! 開発環境(1) PHP4のサポートが終了し、いよいよPHP5への移行を視野に入れる時期が来た。PHP5の機能を生かした開発のポイントを紹介 |
|
クライアントPCに言語環境を入れる理由 Mac OS X+PHPでオールインワン環境(準備編) Webアプリ開発者に人気のMac OS X。効率的な開発のために複数バージョンのPHPを実行する環境を構築してみよう |
|
PHPに押し寄せるリスクと国際化の波 PHPカンファレンス2008レポート(前編) PHP4のサポートが完全に終了する。多くの新機能が投入されるPHP5.3へ移行か、国際化対応で開発が遅れるPHP6を待つか |
|
PHPによる大規模商用サービスの裏側 PHPカンファレンス2008レポート(中編) 企業のWebアプリケーション開発現場で利用されるPHP。開発現場の裏側にはさまざまなドラマが隠されている |
|
PHPユーザーは本当にほかの言語を知らないのか? PHPカンファレンス2008レポート(後編) PHPは本当にダメな言語なのだろうか。Perl、Ruby、Python、Java、JavaScriptの使い手が白熱した議論を行った |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|