【新・言語進化論】言語選択の分かれ道
第5回:WebアプリケーションといえばPHPだが?
著者:Jurabi 西山 星児、岡 俊行
公開日:2007/11/29(木)
例外処理
PHP 4にはC++やJavaなどのtry-catchはなく、処理の結果をそのつど評価する処理を記述する必要がある。これには筆者も慣れるのに苦労した。Javaであれば、必要なエラー処理を記述しなければコンパイルエラーになるのに対してPHPはそういった強制力がなく、PHP初級者の筆者は必要な例外処理を書かずに進めてしまい、思わぬ問題に頭を悩ませることがあった。
不完全なオブジェクト指向
オブジェクト指向にはメソッドやメンバ変数などにpublic/privateなどのアクセスレベルを設定できるのが一般的だが、PHP 4ではこういったアクセスレベルの設定ができない。
そのためクラスとしてのセキュリティが甘くなり、不用意にクラスを作成すると問題を引き起こす原因になりかねない。筆者の場合はリファクタリングをする際に、privateレベルのメソッドであればインターフェースも含めてリファクタリングを行い、publicレベルであれば影響範囲を見据えた上で行動に移している。
頻繁に発生する脆弱性の問題
読者の皆さんもご存じのようにPHPは言語そのものに多くのセキュリティホールが発見されている。代表的な問題にグローバル変数の脆弱性がある。
グローバル変数は外部から入力されたデータ(GET、POSTなど)を$変数名という書式で使えるようにしてくれるというものだ。これはすでに使用済みの環境変数などをも上書きしてしまい、プログラムに思わぬ問題を引き起こす。
PHP 4.2.0以前は、php.iniのregister_globalsはデフォルトでオンとなっていたので、プログラム上では環境変数を使っているつもりでも、GETやPOSTのデータによりグローバル変数に置き換えることができてしまうという恐ろしい欠陥があった。
register_globals = On とした場合
<?php
if ($isTestUser()) {
$isTest = true;
}
if ($isTest) {
print "テストです";
} else {
print "テストではありません";
}
?>
このプログラムで使用している$isTest変数は、GETやPOSTにisTest=trueというパラメータがあった場合、最初から$isTest=trueという状態になってしまう。そのため$isTestUser()の戻り値がfalseであった場合でも、「テストです」が出力されてしまうのだ。
このように、例外処理、オブジェクト指向言語、リファクタリング・メンテナンス時のリスク、セキュリティなどに問題を抱えたPHP 4は基幹システムなどにはなかなか使われる機会がなかったといえる。
PHP 5とRuby on Railsの登場
PHPのメジャーバージョンは現在では5となり、筆者が先述した例外処理やアクセスレベルなどの欠点は言語仕様に取り込まれて解消されている。ただし、セキュリティ面についても改善されてはいるが、依然として関係者は常にアンテナを張り巡らせておいた方がよいだろう。
オブジェクト指向言語へと生まれ変わったPHP 5は、その「オブジェクト指向」という面が言語としての難易度を上げ、旧来のPHPプログラマにとって少々敷居の高いものになったといえる。正直、PHPプログラマがPHP 5でオブジェクト指向プログラミングを行うかどうかというのは疑問が残ることは確かだ。
しかし、PHPはHTMLを動的ページへと簡単に切り換えることができるという大変便利な言語であり、その点において他の言語と比べても非常に優れているといえよう。
また、筆者のようなJava経験者にとってPHP 5はとても近寄りやすい言語になったといえる。ほとんどのC++、Java開発者にとって、PHPは「なんちゃってオブジェクト指向」としての認識が続いていたが、PHP 5はそれらの開発者に「ちょっと触ってみようかな」と思わせるくらいのレベルにまでは到達したと考えている。
さらにRoR(Ruby on Rails)の登場により、あらためてLightweight Language(ライトウエイト言語)が注目を浴び、PHPもその影響を受け、CakePHP(http://www.cakephp.org/)、symfony(http://www.symfony-project.org/)といったRailsライクなPHPフレームワークが登場している。
言語選択のポイント
言語選択という作業は、言語仕様や言語特性という要素だけではなく、どのようなフレームワークが存在するのか、という点も大きな影響力を持つようになってきている。
それらの要素がプロジェクトの特性に対してどのような効果をあげることができるのかという部分をよく考え、プロジェクトを成功に導く言語を選択すればよいだろう。また、EoDやアスペクト指向など、時代ニーズに影響受けながらバージョンアップしていく言語仕様も見逃せない要素だと筆者は個人的に注目している。
結論から言えば、そのメリットからPHPは今後も使われることは確かだ。PHP自体は、ほかのプログラミング言語に影響を受け、影響を与え進化している。今後もさまざまなプログラミング言語が登場し、お互いに影響しあい、開発現場で使われることになるだろう。では、今後どのようなプログラミング言語が使われるようになるのだろうか?
本連載の最後に、第2回の筆者であるJurabiのJurabi CTO 岡 俊行氏に再び登場いただき、将来の開発現場ではどうようなプログラミング言語が求められるかについて考察していこう。 次のページ