翔泳社片岡様より献本御礼。

ある意味実にPHP的な一冊。PHP本は、これ一冊あれば十分だと強く感じた。

PHPを使うにしても、使わないにしても。

本書「PHP逆引きレシピ」は、「PHPでプログラミングを習う」のではなく、「PHPで動くWebサイトを作る」に徹した一冊。PHPは後者に特化した言語である故に、前者には徹底的に向かない。本書を読めば、PHPを全く知らないプログラマーにもそれがわかるし、PHPを日時使っている人も、そのことが改めてわかるはずだ。

目次 - | PHP逆引きレシピ オフィシャルサポート より
第1章 準備
1.1 サーバー環境
1.2 開発環境
第2章 PHPの基本構文
2.1 変数
2.2 定数
2.3 条件分岐
2.4 繰り返し処理
2.5 関数
2.6 ファイルのインクルード
2.7 エラー処理
第3章 PHPの基本テクニック
3.1 文字列
3.2 数値
3.3 日付時刻
3.4 配列
3.5 PHPの設定
3.6 ベンチマーク
第4章 ファイルとディレクトリ
4.1 ファイル
4.2 ディレクトリ
4.3 PDFファイル
4.4 CSVファイル
4.5 画像ファイル
第5章 PEARとSmarty
5.1 PEARの使い方
5.2 Smartyの使い方
第6章 Webプログラミング
6.1 フォームの基礎
6.2 フォームの実際
6.3 入力データの加工
6.4 Cookie
6.5 セッション
6.6 ファイルアップロード
6.7 メール処理
6.8 ネットワーク
6.9 HTTPヘッダー
6.10 データベース(MySQL)
6.11 その他
第7章 クラスとオブジェクト
7.1 クラスの基礎
第8章 セキュリティ
8.1 セキュリティ対策の基本
8.2 PHPの設定
8.3 セキュリティ対策
第9章 トラブルシューティング
9.1 エラー表示など
9.2 文字化け
第10章 アプリケーション編
10.1 phpMyAdmin
10.2 WordPress
10.3 MyNETS

本題に行く前に、本書を使う前の留意点を。本書のコードサンプルだが、印刷してあるものはそのままでは動かない。たとえば、

P. 48
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>変数と文字列の出力</title>
</head>
<body>
<?php
# 変数$nameに文字列を代入します。
$name = 'PHP逆引きレシピ';
# 変数$Nameに文字列を代入します。$nameと$Nameは別の変数です。
$Name = 'CodeIgniter徹底入門';

# 文字列と変数の値をecho文で表示します。
echo '書籍名: ' . $name . '<br />';
echo "書籍名: {$Name}\n<br />";
echo '書籍名: {$Name}\n<br />';

$format = '書籍名: %s、%s<br />';
echo sprintf($format, $name, $Name);
?>
</body>
</html>

なのだが、印刷バージョンはこれが以下のようになっている。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>変数と文字列の出力</title>
</head>
<body>
<?php
変数$nameに文字列を代入します。
$name = 'PHP逆引きレシピ';
変数$Nameに文字列を代入します。$nameと$Nameは別の変数です。
$Name = 'CodeIgniter徹底入門';

文字列と変数の値をecho文で表示します。
echo '書籍名: ' . $name . '<br />';
echo "書籍名: {$Name}\n<br />";
echo '書籍名: {$Name}\n<br />';

$format = '書籍名: %s、%s<br />';
echo sprintf($format, $name, $Name);
?>
</body>
</html>

そう。コメントを示す#が印刷からは抜けてしまっているのだ。私はPHPプログラマーでないので、これも見たときむしろ「え?PHPって文芸的プログラミングが出来るんだったっけ?」と勘違いしそうになったが、実際に動かしてみてそれが誤解であることを改めて確認した。サポートサイト

で配布しているコードの方は問題がないので、実際に使うのであればそちらを利用して欲しい。

で、本題。

本書を読了した今は、確信を持って言える。PHPは、プログラミング言語として学ぶべきものではないと。山のような、しかし相互に関連しない関数。そして一貫性のない関数名。後のことを考えない、つぎはぎだらけの仕様....PHPほど、「こう言語を設計するべきではない」という言語はないのではないか。

しかし、よく考えてみれば誰もがプログラミング言語を覚える必要はないし、「プログラミング言語を覚えなければ動くWebを作れない」というのがプログラマーの傲慢であることを証明したのもPHPだった。「動くWebを作りたい」という人にとって、プログラミングというのは過程の一部に過ぎないし、多くの場合動く部分はごく一部だ。Webプログラミングにおける最も重要な言語は、なんといってもHTML。このHTMLの中に埋め込めるPHPは、それだけで「Webページを動かしたい」人にとって、他のプログラミング言語よりもずっと身近に感じられることは確かだ。

しかもPHPの場合、やりたいことは呪文一発で出来ることも多い。他のプログラミング言語だったら小さな呪文を組み合わせてやるところが、PHPなら「一言で済む」。本書の構成は、まさに「こんな時のための一言」をすぐに探せるようになっていて、本書があれば「やりたいこと」を「深く考えず」にやることができる。

だからこそ、PHPはプログラミング言語を学ぶのに向かないのだ。考えることを求めず、逆に考えようとすると「なぜこうなっている」のかを知るのは絶望的。PHPは「動かす」報酬を最大化するために、「学ぶ」報酬をばっさり犠牲にしているのだ。

よって、PHPを「学ぼう」とするのは、時間の無駄だと弾言する。学ぼうとするから報われない。ただ必要な時、必要な呪文を、必要なだけ唱えればいいのだ。それ以上をPHPに期待するのは間違いだ。「なぜ」を問うてはならない。

PHPには見向きもしない人も、MediaWikiやWordpressを使いたい場合はあるだろう。場合によってはプラグインを書く場合も。本書はそのような時に役に立つ。PHPは無視するにはあまりに普及している。しかし深く付き合おうとすればすれば、うんざりせざるを得ない。深く付き合わなければいいのだ。あくまで浅くつきあえば。

本書が、それを可能にしてくれる。実にありがたい一冊ではないか。

Dan the Man with Too Many Languages to Speak