パーフェクトPHP教室

今話題のパーフェクトPHPが届きました。

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

なんでPHP本なんか買ってるかというと仕事でPHP書いてるからなのですが(;´Д`)
この1年半PHPと仲良くやっていこうとしつつも何度も苦渋をなめさせられてきた身としては、仕事で使うには本当に…ほんっとうに恐ろしい言語だなということをしみじみ感じております。とはいえ、社内で使用する言語を変えるなんてことはそう簡単にはできないのでやっぱり今後もPHPと付き合っていく必要はあるわけで、少しでも仲良くしていく方法が書いてあればなーと期待を込めて買ってみたわけです。


まあ、まだ本の中身は読んでいないので、とりあえず今日はPHPについて思うあれやこれやをぶちまけようと思います。PHPを少し触った人ならきっと誰でも思うだろうペラい話ですが、たいてい苦しめられるのはこの初歩的な部分だったりするんですよね…。

弱い動的型付け

ご存知のとおりPHPは動的型付け言語です。

<?PHP
$a = 100;
$a = "hoge";
$a = new StdClass();

な感じで変数に値を割り当てたときに変数の型が決まります。動的型付けの中でも、弱い動的型付けというのは、異なる型同士の演算時に自動的に違う型に変換してくれる(変換しようと試みる)ものを言います。

<?PHP
$a = 100 + "hoge"; // $a => 100
$a = 100 . "hoge"; // $a => "100hoge"

強い動的型付けのPythonとかではエラーになる演算がPHPでは通ります。便利ですね。便利ですけど死ねばいいのにと思います。


明示的に数値と文字列の変換をプログラムの中で書いて変換されるのはまだ自業自得と許せます、関数の引数として文字列を与えたときに自動的に中で数値に変換されたりすると泣けます。

<?PHP
$a = array(0);
var_dump(in_array('', $a)); // => true

まあオプションの第3引数にstrictフラグなんてものがあったりするんですが、そんなの用意するならPerlのuse strictみたいにphp.iniで全体の動き(型変換)を制御できるようにしとけよ、と思う。本当に死ねばいいのに。

とにかく止まらない

存在しないキーワードを参照しても止まりません。存在しない変数にアクセスしても止まりません。ゼロ除算したって止まりません。

<?PHP
$a = 1;
print ($a / 0);
print "hoge\n";

// output
PHP Warning:  Division by zero in /home/nakamura/hoge.php on line 3
hoge

他の言語で致命的なエラーとしてしまうたいがいのことをWarningで済ませてしまうPHPの度量には痛み入ります。何考えてるんでしょうね。


逆にFatalが出て止まるパターンとしては、存在しないメソッド・関数呼び出し、継承元に指定したクラスが存在しない、requireで読もうとしたファイルが存在しないなどなどで、requireとinclude2種類用意してるあたりとかPHPはさすがですよね。
変数が無くてもnullとして扱っちゃうんだから、存在しないメソッド呼び出したら自動的にnullが返る、とか継承元クラスが無かったら自動的に親クラスなしでクラス定義しちゃうとかそこまでやればいいのにと思います。誰も得しませんけどね!!

ま、もうしばらくはこの素敵なPHPと付き合っていくつもりです。




と、つらつらとPHPに対する不満を述べてきたわけですが、不満があるということは理想のプログラミング言語像ってのもあるべきだよな、と思う今日この頃です。理想のキーボード配列を求めていろんなキーボード配列を試すようにね*1
僕がプログラミング言語に求めるのは書き手のアイデアをできるだけ早く実現できることが最優先です。「早く」というのはもちろん成果物を出力するまでの時間が短いことであり、出力される成果物は一定の品質を持っていることが求められます。

僕にとってのPHP(特に5.2系)は関数型機能のサポートも不十分で書きやすくもないし、品質を保証するのも大変で、結果的に成果物の出力に時間がかかるので理想からは程遠いというのが現状の認識です。

好きな言語で言えばC#, Pythonで、ここ最近はHaskellを触り始めたりしたところですが、どれも一長一短でこれが理想の言語であるというのはやはり難しいですね。今のところは、作りたい物や、提供する形、求められる品質などから適材適所で選んでいくという無難な結論にならざるを得ないです。

*1:ちなみに理想のキーボード配列ってのも実はあんまりイメージできてなかったりします。これについてはまた今度考えてみます