墜落日記 - 2009年6月7日の墜落
PHP はダメ言語
現在、自作 PHP フレームワーク Ag:PURE 2.0 の慣熟試験中なのだが、久々に PHP を呪った。
Ag:PURE 2.0 では構造化配列というクラスを導入した。
この構造化配列というのは深くネストされた配列を操作する手続きを隠蔽したモノで、
$value = $array_value['index1']['index2']['index3']
なんて配列に、
$sArray = new CPureStructArray($array_value);
$value = $sArray->get('index1.index2.index3');
の様にアクセスできる。
これにより深い配列を利用した際のエラーチェックや構造的なアクセスを簡略化できる。
これをリクエストの処理にも適用して、
<INPUT name="article.article_title" value="ほにゃらら">
を、
$article_title = PURE_WEBAPPS::getContext()->getRequest()->get('article.article_title');
として取れるように考えた。
なのだけど、PHP の仕様上の欠陥でこれが出来なくなってしまった。
外部変数名のドットは容赦なくアンダースコアに変換されてしまうのである。
以下、PHP マニュアルからの引用。
重要なことを記述しておくと、このため、外部変数に含まれるドットを PHP は自動的にアンダースコアに変換します。
なので、上記の例では、"article.article_title" は "article_article_title" となってしまって、正常に構造化されない。
このバグ仕様は元々悪名高き register_globals ディレクティブの仕様により、外部変数を PHP の変数にマップする際の処理である。
舐めるな馬鹿野郎。
register_globals の発想自体が馬鹿だというのに、register_globals に引きずられて要らない仕様を残しやがって、register_globals が OFF なら変換の必要など無いだろうに………
上記のような構造化を行いたいならば、
<INPUT name="article[article_title]" value="ほにゃらら">
と記述しなければならない。
しかしこれでは構造化配列と HTML のフォームの名前が一致せず、コードの視認性が低下するし………
$request = file_get_contents('php://input');
でリクエストボディを取得することは出来るのでここから独自解析するのも手だが、マルチパートで送られると取得できないというバグ仕様がある。
要はファイルアップロードと混在できないわけだ。
完全に巫山戯ているとしか思えないバグ仕様だ。
まったく、前々から確信していたけど PHP は言語として破綻しているよな。
こんなだからいつまで経っても PHP はダメ言語だと後ろ指さされるんだ。
コメントは投稿されていません。