オブジェクト指向言語に生まれ変わるPHP5[後編]

PHP5の新機能とPHP4との互換性

小山 哲志

2003/5/27

クラス以外の拡張機能

 クラスに関する拡張機能は大体こんなところだ。それでは、クラス以外に拡張された機能についても述べておこう。

引数が参照の場合のデフォルト値

 「配列を書き戻したい」など、関数の引数を参照で受け取りたい場合がたまにあるが、PHP4では参照で渡された引数にデフォルト値を設定することができなかった。

 PHP5では、参照の引数に対してもデフォルト値を設定できる。なお、オブジェクトが引数の場合は、前編で書いたとおり「&」を付けなくても参照渡しになるので気にする必要はない。

<?php
function some_func(&$var == null) {
  if ($var == null) {
    // 何か特別な処理
  }
}
?>

__autoload()

 存在しないクラスを使用するプログラムを記述した場合、通常ならエラーになって終了するだけだ。しかし、__autoload()という関数が存在すると、エラーになる前にその関数が呼ばれる。__autoload()内では、include_onceなどでそのクラスの定義ファイルを読み込むようにしておけば、エラーになることなく処理は続行される。

 大規模なPHPサイトでは、1回の実行に非常に多くのファイルを読み込むことになるのが宿命だが、必要なクラスのみ読み込んで負荷を軽くする仕掛けとして、__autoloadは面白いかもしれない。

<?php
function __autoload($className) {
  include_once $className . '.php';
}

$object = new ClassName;
?>

例外処理

 プログラミングにエラー処理は避けて通れない事項だ。とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。その煩雑さを回避するため、文法として例外処理を持っている言語もある。PHP5もそれに倣って、言語仕様として例外処理をサポートした。

 文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。ただし上記の2言語と異なり、PHP5の例外機構ではオブジェクトしか投げることができない。また、例外をcatch{}で受け取る際は、型指定の柔軟なPHPでは珍しく、受け取る例外オブジェクトのクラスを指定する必要がある。これは多分、複数のcatch{}をサポートするには、型指定が避けられないためだろう。

 なお、例外処理のサポートによりtry、throw、catchの3語は予約語になった。これらの単語をすでに使用している場合は修正が必要になる。

<?php
class MyException {
  function __construct($exception) {
    $this->exception = $exception;
  }

  function Display() {
    print "MyException: $this->exception\n";
  }
}

class MyExceptionFoo extends MyException {
  function __construct($exception) {
    $this->exception = $exception;
  }

  function Display() {
    print "MyExceptionFoo: $this->exception\n";
  }
}

try {
  throw new MyExceptionFoo('Hello');
}
catch (MyException $exception) {
  $exception->Display();
}
?>

バックトレース

 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の使い手が白熱した議論を行った
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間