記事一覧

PHPの悪いところ - デメリット




目次



PHPを1年半がっつり使ってみて

ハロー、みなさんエジソンです。

前回、PHPの良いところについて書き連ねました。

Related Posts

PHPの良いところ - メリット



今回は、PHPを使っていて気になった悪いところを書き連ねていきます。

PHPの悪いところ

エラーハンドリングの難しさ

PHPのエラーは2種類に大別されます。

警告レベルのエラーと、致命的なエラーです。

そのうち、警告レベルのエラーは、通常何も行わないと、エラーが発生した瞬間に通常の処理ブロックから外れて、デフォルトのエラー処理関数に処理が委譲されます。

警告エラーを例外オブジェクトに変換して送出されるようにすることが可能なんですが、一方で致命的なエラーは例外にして送出することができず、その場でプログラムが終了してしまいます。

ちなみに、致命的なエラー発生時にはコールバック関数を登録することができますが、エラー発生地点に復帰することはできません。

このように、警告と致命的とでエラー発生時のフローが2系統あるというのは、非常に面倒です。

Javaや、.Netなどモダンなプログラミング言語なら、全て例外で送出されるため、最上位で例外をキャッチして例外の種類によって処理を振り分けるといった事が可能ですが、PHPではそう上手く処理できません。

私はこの事実に気づいたのが、恥ずかしながら最近の話でした。

そもそも、警告レベルのエラーという中途半端な存在がどうにも好きになれません。歴史的な名残もあるのでしょうが、警告は最大レベルに設定してエラー扱いにして、厳密に処理していきたいと考えている身としては、どうにも馴染めない箇所の一つであります。

リファクタリングの難しさ

PHPの関数、メソッド、フィールド、クラスの名前など、プログラムの最小構成要素となるものというのは、得てして後から名前を修正したくなるものです。

ただ、型定義という概念が無いPHPにおいては、IDE(例えば、NetBeansとか)でのリファクタリング機能を用いても、変更対象となるシンボルの全てを厳密に変更する事ができません。名前が重複していたりすると、余計な部分まで更新されてしまい、後で泣きを見るということも何回か経験しました。

ですが、最近では関数の仮引数に型表記ができるなど、少しずつ進化しているようです。

実行時エラー地獄

プログラムって、一度にコーディングする量が増えれば増えるほど、動作確認する時の難易度が上がりますよね?

JavaやC#等においては、コンパイラによって事前検査できる分、動作確認でエラーが発生する率を下げることができますが、PHPだとそううまくいきません。

PHPの場合は、例えば変数の定義が無いことでエラーになることが度々あり、私はこれを実行時エラー地獄と呼んでいます。コンパイラ言語なら事前に検証できる事を、PHPでは Try & Error で繰り返し実行していくのは、大変非効率な作業です。

PHPを長く経験していればしているほど、エラーメッセージから瞬時に対処方法を推察することが可能ですが、慣れてい無い人が取り組む分には、エラーを解消するコストは膨れ上がり効率が思うように上がらない事も多々あることかと思います。

パフォーマンスの悪さ

PHPという言語を前提に、高パフォーマンスを求められた場合に、安定してパフォーマンスを向上させるのが難しいです。

もちろん、一般的に使う分には、大した問題にはならないのですが、バックエンドでバッチなどの処理を実行する際には、大量のデータを高速に処理する必要がありますが、そんな場合には、コンパイラ言語に軍配が上がるかと思います。

APIの命名に統一感がない

APIの命名に統一感がなかったり、名前を一見しただけでは、何をするのか分からない関数が多いという印象を受ける事が多いです。

basenameという関数があるのですが、これはファイルパスを引数にしてファイル名を返却してくれるものです。しかし、basenameという名前で、ファイルに関連する関数であるかを連想できる人は、まずいないでしょう。

このように、名前を見ただけでは何をしてくれるか分からない関数が多々あります。

まとめ

PHPは長い歴史の中、素晴らしい進化を遂げてきましたが、その進化はシンプルでエレガントではなく、過去の資産を全て残しているので、全体的にごちゃごちゃした印象を感じずにはいられません。

取り扱いが簡単で初心者でも簡単、と思わせておいて、実は徹底的に真剣に向き合おうとするほど考慮することが多く、取り扱いが難しいのが、PHPの本質なのかもしれませんね。

以上に挙げた問題点は、PHP7がリリースされることで、かなり解消されると考えています。今後に期待しましょう!
関連記事

このエントリーをはてなブックマークに追加

コメント

No title

最後のbasenameについては、たぶん古くからあるシェル関数のそれが由来でしょうね。
シェルを触っている人ならば割と知ってるでしょう。
どちらかというと、(個人的には)implode()とかexplode()とか、ってほうが文意に近い関数かなぁ。なんでそんな名前なの、素直にjoinやsplitでいいじゃん、っていう。

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp