PHPはスジが悪い言語
カテゴリ: PHP
おごちゃんの雑文 » Blog Archive » だから言わんこっちゃないより。PHPから負の遺産と言われるCOBOLと同じ空気を感じるのは、猫の杓子もCOBOLプログラマになったり、COBOLプログラマをかき集めてプロジェクトを行ったりといった状況が似ているから、という話の一節。
ただCOBOLもそうなんだけど、結局その言語の評価ってのは、「どんなシーン」で「どんな人達」が使っているかということでほとんどが決まってしまう。PL/Iや4GL達(「やJava」と書きたい私がいる)みたいに言語そのもののスジが悪いなんてことは、そうそうない。
私は、PHPはそのスジの悪い言語だと思う。言語自体はそれほど悪くはないとは思うが、ランタイムの機能や標準ライブラリがどうにも良くない。PHPを使う利点はデータベースを利用した動的なウェブサイトが手軽に作れるというところにあり、PHP自体もそういった用途を想定して作られている。が、肝心のそれらの機能がアレというか、普通に使うと駄目な実装になってしまうものや、そこまでひどくなくても関数名が適切でないというものがある。Webアプリケーションが主要な用途にも関わらず、PHPを通じて「Webアプリケーションはこうあるべき」ということは学べないというか、むしろ変なことを植え付けられるというのは、筋が悪いと言わざるを得ないだろう。
たとえばHTTP関係の処理では、もはや誰も使っていないはずのregister_globalsというものがある。クエリーに含まれるパラメータを、パラメータ名と同じグローバル変数に代入してくれるという恐ろしい機能だ。$_REQUESTは、リクエストパラメータとクッキーをまとめたハッシュで、これを使ってクッキーを参照すると、クッキーだと思っているものが実は第三者がURLに付加したクエリーパラメータだという罠に嵌まる。htmlspecialchars()はHTMLのメタ文字を文字参照にエンコードする関数だが、関数名に動詞が入っていないのでエンコードするのかデコードするのかは名前だけではわからない。PHP的にはデコードではない正のフィルタ関数には名詞だけの名前を付けるというルールになっているようだが、それでもhtmlentities()はひどい。HTMLにあるのは数値文字参照と文字実体参照で、そのふたつを総称して文字参照と呼ばれることはあるが、HTMLエンティティと呼ばれることはない。HTMLエンティティという言葉からHTMLの仕様にたどり着くのは難しいだろう。
データベース関連にも、もはや誰も使っていないと思いたいマジッククォートという機能がある。入力に含まれるSQLの文字列のメタ文字を自動的にエスケープするという機能だが、元々はMySQL用の機能だったためエスケープ用のメタ文字が \ になっている。標準のSQLではエスケープルールが異なるため、DBMS専用のエスケープ関数を使用する必要がある。また、マジッククォートが必要ないコンテキストで値を使用する場合はエンコードを解除する必要があるが、解除を失念すると \ が増殖していくという問題が発生する。SQL用の手動のエスケープ関数としてaddslashes()が用意されているが、行われるのは \ によるエスケープなので、この関数を使うことは適切ではない。
こういった罠は解決されつつあるが、過去に作られたアプリケーションにはそのような罠に嵌まったままのものが存在することは十分考えられる。また、入門者が容易に参照できる入門者向けの解説というのが流行り始めに書かれた数世代前の情報という場合も多く、そのような解説を読んでしまった人は罠入りの方法を今もなお使ってしまうかもしれない。PHPの恐怖は、そんな負の遺産が今もなお生産されているように感じる所にもあるような気がする。
コメントを投稿する