2009年07月06日 14:30 [Edit]

教科書はいらない - 書評 - PHP逆引きレシピ

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

ある意味実に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


この記事へのトラックバックURL

この記事へのトラックバック
PHPを覚えようと思ったのは今の会社に移ってきて、webシステムがPHPで作られていたからだ。まあ、セオリーにのっとって、入門書と、中級書と、言語辞典みたいなのを揃えてまあ、一通りかけるようにはしたのだけど、どうも違和感が残っていた。弾blogを読んでそれがすきっ...
PHPに対する違和感【南雲式】at 2009年07月10日 20:55
この記事へのコメント
rubyはともかくperlはphp以上に言語としてUNKだし実用度としてもハイパーUNK
Posted by hoge at 2009年07月12日 03:14
PHPの話題に限らず、(プログラム言語・技術を)学ぶ為の言語と、
(何かを作る為の)実用の為の言語は別だと思っています。

一つの言語で両方を一緒にこなそうとするから、
言語に文句をつけることになるわけで。

さっさと動くものを作りたいのならPHPを使え。
でも、プログラミングの基礎を知りたいのなら、アセンブラやC言語を学べ、
でも、さっさと動くものにそれらの言語を使うな。
(もちろん組み込み系などで使用できる言語が限られている場合は除く)

両方やるのは時間の無駄?
急がば回れというでしょうw
Posted by   at 2009年07月11日 14:46
>> PHPerからすると、「ハッシュをソートしたものは、ハッシュで返してほしい」と、RubyとPythonに思うわけなんだけも。
>この一文が全てを物語ってる気がする。
>偽物を本物だと勘違いしそれに気付くチャンスも与えられずそれが世の常識と異を唱えたり広めようとする。
「ハッシュをソートしたものは、ハッシュで返してほしい」って考えが偽物ってことですかね?

暴言かもしれませんが、その言い回しだとLL言語全部が”偽物”になると思いますけど?
Posted by PHPer at 2009年07月10日 12:33
PHPは便利で簡単で使いやすい。
言語ってそれで十分じゃないかと思います。
少なくともWeb系でシステム作るにあたって、PHPに”勝てる”言語ってあるんですかね。
Posted by G at 2009年07月09日 14:19
どな言語にしろ、“逆引き”だけを見て作ると、切って貼ったような
つぎはぎだらけのものになっちゃいそうな気がします。
PerlやRubyのような場合は逆引き本だけで作ってもイイ感じになるんでしょうか?
Posted by ↑ at 2009年07月09日 11:22
そもそも逆引きリファレンスを見て判断することが間違っているような気がしますが・・
Posted by kenji at 2009年07月09日 11:13
> PHPerからすると、「ハッシュをソートしたものは、ハッシュで返してほしい」と、RubyとPythonに思うわけなんだけも。
この一文が全てを物語ってる気がする。
偽物を本物だと勘違いしそれに気付くチャンスも与えられずそれが世の常識と異を唱えたり広めようとする。
Posted by だんdan意識が薄れていく at 2009年07月09日 09:02
別にダンコーガイは言語開発者じゃないよ?
Posted by ↑ at 2009年07月08日 23:21
まあこの人のお小遣い稼ぎのための文章だと思うけど
どうして言語開発者は他人を見下して自分を立てることをするのですか?
それでいて話題になる別の言語のweb開発者と対談したり
使う言語に応じて人を選ぶ、まるで話す言葉が違うアジア人同士が
醜い争いをしているのと同じに見えました。
Posted by げ at 2009年07月08日 14:08
ハッシュの順序ってスタック順じゃない?
Pythonはそうでもなさそうな感じだったけど。

単純に「キーでソートしたい!」って思ったときに、決まり切った文句をlamdaなりブロックに入れなきゃいけないし、ましてや結果が多次元配列だし。

そして、その配列をeachしたら、value[0]とvalue[1]でアクセスしなくちゃいけないってのがなんだかなぁと。
Posted by PHPer at 2009年07月08日 10:49
私もC/C++でプログラム覚えた関係でライトなPHPは当初馬鹿にしてたんですが、
最近phpで作られたsymfonyってフレームワークを使ってみたらこれがすごい。
Ruby on railsもSeasar2も使ってたけど、一番わかりやすくスッキリな設計されているのは
symfonyだった。

まぁphpじゃなくてsymfonyを作ってる人達がすごいのかも知れないけど。
Posted by シンフォニスト at 2009年07月08日 00:14
↑ハッシュに順序ってあったっけ?
Posted by 計算機屋 at 2009年07月07日 21:19
PHPerからすると、「ハッシュをソートしたものは、ハッシュで返してほしい」と、RubyとPythonに思うわけなんだけも。
なんで[[key, value]]で返すのだろうか
Posted by PHPer at 2009年07月07日 20:38
純粋なというか古いPGはC言語とかPerlを好むようです。
低レベル言語(ハードウェアよりって意味)とか、スキル差、個性が出るようなの。
デザイナー兼とか、なんちゃってPGが多い、言語仕様の汚さで、PHPは煙たがれるような気がします。
#元来職人気質の強い人間が多い職業だからってのもある
Posted by あ at 2009年07月07日 14:36
>「こう言語を設計するべきではない」という言語はないのではないか。

じゃあ「こう言語を設計するべき」という言語って何よ?
Posted by だ at 2009年07月07日 12:01
エントリの内容はしごくもっともだけど
またコメント欄にキチガイがたくさん湧きそうですね!
Posted by わぁい! at 2009年07月07日 08:27
なんでこいつにPHP本なんか献本したんだよw
クソ食って死んだほうが良いと思いますよ。
Posted by 名前 at 2009年07月07日 06:04
hikiproさん、
このエントリを読んで、なぜ否定的なのかわからないようでしたら、精神構造がぴったりPHP向きということですから、他人の言葉に惑わされることなくPHPを使い続けたらよいと思いますよ。
Posted by ま。 at 2009年07月06日 16:50
はじめまして〜。
いつも楽しく拝見させて頂いてます。
子飼さんはPHPに関して良い印象をお持ちでないというのが良く伝わってきましたw
Webプログラミングをする時、PHPくらいしか触れないので悲しい気分になることもありますw

Googleで
site:blog.livedoor.jp/dankogai php
というキーワードで検索してみると、子飼さんがPHPに関して言及されている記事がたくさん出てきますねw
今日の記事だけを拝見すると、なぜPHPに関して否定的なのか少し分かりにくい気がしました。

個人的な妄想として聞き流して頂けると嬉しいんですがw、過去に書かれた内容を箇条書きにしてまとめたページがあったら嬉しいなぁなんて思っています。
Posted by hikipuro at 2009年07月06日 15:33
>PHPは「動かす」報酬を最大化するために、「学ぶ」報酬をばっさり犠牲にしているのだ。

まさに、PHPは実用第一主義だと思います。
プログラマーとしては他の言語を使った方が最終的
な生産性はあがると思われるシステムでも、PHPで
「一言で済む」ということを変に知っている人がPM
だと、他の言語で「小さな呪文を組み合わせる」こと
を嫌がる場合が多いので、現場ではPHPが多くなる
と思われます。

>PHPは、プログラミング言語として学ぶべきものではないと。

プログラミング言語として学ぶべきものを
ご教示いただけるとありがたいです。
(私は C言語とLispとSmalltalkが学ぶべき言語では
ないかと思っております)
Posted by C言語が好き at 2009年07月06日 15:28