General

PHPは駄目な言語なのか?

2008年2月11日

PHPがいかに駄目な言語か、という話

・「PHPは初心者に学びやすい」と言われる?
・strpos('abcd','a')は0を返すが、0は偽である。
・いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
・一貫性のない名前(str_replace,strlen,parse_strとか)
・引数の順番がわかりにくい(in_arrayとかstrposとか)
・グローバル。
・lambda(無名関数)。
・PHPで書かれたたくさんのアプリがある?
Matzにっきより、抜粋)

「PHPは初心者に学びやすい」と言われる。
 別の記事でも述べた<ことと関連するが、PHPはコンピューターの本質の部分を多く残した言語だ。オブジェクトなんて小難しいものを理解しなくても、プログラムが書ける。例えば、数値はあくまで数値であり、オブジェクトの一種なんてことは、PHPではありえない(少なくとも、今のところ)。そもそも、『数値もオブジェクトの一種』なんて聞いたことが無いという人がほとんどだろう。

strpos('abcd','a')は0を返すが、0は偽である。
 『0』が真であるなんてプログラミングの世界以外では聞いたことが無いが、このようなことはPHPには当てはまらない。
 1と0だけで構築されているコンピューターにおいて、私たちが認識する整数の『0』は、32ビットコンピューターの場合、2進数で00000000000000000000000000000000である。真か偽かを2進数で表現すると、1か0かである。これを32ビット整数に当てはめると、『1が一つでもある』が真で『全部0である』が偽、つまり、『0以外の数値』が真で『0』が偽ということになる。これは、コンピューターの本質から外れていないばかりか、数学を通じて数とは何かを考えている我々にとっては、理解するのに無理のない概念だ。
 ほかの例として、ビット演算子を考えてみよう。PHPにおいて、E_ALLは6143(2進数で1011111111111)で、E_NOTICEは8(2進数で0000000001000)である。ビット演算子『&』を E_ALL & E_NOTICEのように使うと、8(0000000001000)を返し、これは真である。一方で、6134 & E_NOTICEは、0(0000000000000)を返し、これは偽である。これは、CPUの中で行われている演算と同じだし、私たちの一般常識に当てはめても無理が無い。

PHPは紳士的な言語だ。
 上でも述べたように、コンピューターの常識がそのままPHPの常識であることが多い。少し乱暴な言い方をすると、『これがルールだ』という、上から押し付けたような要素が少ないといえる。また、PHPの機能向上の際、ユーザーからの要望を元に新しい機能を追加していることが伺える。このようなことが理由で、次に述べるように、支離滅裂的なところも多少ある。しかし、これもご愛嬌だろう。

いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
 storpos('abcd','z')はfalseを返すが、0と同じくこれも偽である。そこで、0とfalseを区別するために、PHPでは新しい比較演算子『===』を導入している。これは、ほかのプログラミング言語には無い演算子だ。ほかの言語での別のやり方の例として、JavaScriptのindexOfの場合は見つからないケースでは-1を返している。それぞれの方法に一長一短があり、どれがベストというものではない。好みの問題である。

一貫性のない名前(str_replace,strlen,parse_strとか)
引数の順番がわかりにくい(in_arrayとかstrposとか)

 先にも述べたとおり、要望のあったさまざまな関数を導入する際、こうなってしまったものと思われる。開発環境でヘルプファイルをすばやく閲覧できるようにしておけば良いだけなので、これは根本的な問題では無い。

グローバル。
 初心者のうちは、グローバルにコードを並べるようなプログラムが分かりやすい。プログラミングを覚えたばかりのころは、ほとんどのケースでそんなプログラムになるだろう。ただし、ひたすらグローバルに書き続けるのでは拡張性に乏しいといえる。慣れてくれば、やがては関数やクラスを記述することになる。
 例えば、次のようにすればグローバルに1行記述するだけでよい。

manager::start('foo');
function __autoload($classname){
    require_once(dirname(__FILE__).'/classes/'.preg_replace('/[^a-zA-Z0-9]/','/',$classname).'.php');
}


 このようにPHPでは、初心者からプロまで、幅広いプログラマー層が自分の知識の範囲内でプログラムが書けるようになっている。

lambda(無名関数)。
 create_function で無名関数を作成することができる。ただ、かなり使いにくいのは事実。大垣氏のブログによると、将来のバージョンではもっと良くなるようだ。

PHPで書かれたたくさんのアプリがある
 ユーザーの数も多い。このことの利点として、例えば、エラーコードをGoogleの検索窓に貼り付けてenterを押すと、自分の探していた答えが見つかることが多い。ほかには、PHPに的を絞ってセキュリティーを解説している本がいくつもあることなど、アプリが多いことやユーザが多いことの恩恵は沢山ある。

コメント

Kat (2008年2月16日 15:45:11)

PHPで仕事をするときの注意。良くまとめられている。

http://slashdot.jp/askslashdot/comments.pl?sid=389009&cid=1290697

コメント送信