PHPの本の話
2008年05月22日 02:48
こちらで開発系の話題を書くのは久しぶりですが、一つ思うことがあって書いてみようと思いました。テーマは、ありふれた話題なのですが、PHPの入門書を選ぶところからスタートしてみます。(一部、書きそびれたところがあったので、追記しました。)
これまで何社かに在籍してプログラムを書いてきましたが、プログラミングに興味を持っている人から必ずと言ってよいほど聞かれるのが「どんな本で勉強しました?」という質問です。僕はプログラミングについて特別の才能をもっているわけでもありませんし、結局は自分が何を読んでどう習得したかという経験談を語るしかありません。それでも、JavaScript, Perl, PHP(あるいは教養程度に Python, Java, C++, Erlang を勉強してます)といった言語を習得しているあいだに、成功したことだけではなく、手間ばかりかかって大した効用がなかったことや、端的に言って失敗したこともあったので、何かの参考にはなると思ってお話ししています。もちろん、何が良かったり悪くてそうなったのか、それは正確に分からないこともあるので、何かに成功したからといって僕が読んだ本をそのまま他人に薦められるとは限りませんし、逆に僕が読み続けなかった本を他人に悪く言えるかどうかは分かりません。ですから、ここでご紹介する内容も、決して鵜呑みにしないで参考程度にとどめ、やはりきちんと自分でルールやゴールを決めて考えてもらいたいと思っています。
「どんな本を読んで勉強したんですか?」という質問に答えるとき、相手がどういう動機をもっているかが分からないと、単に自分が読んだ本のタイトルを答えるだけでは適切かどうか分かりません。開発会社の方と打ち合わせで面識を持ったときに「お愛想」で聞かれたような質問には、営業上の理由もあって、「ヘンにできると思われたくない」場合は、読んだ本の中からスタンダードなものを答えています。逆に「舐められると困る」場合は、いちばん難しい本を挙げています。どちらにしても、それらを読んで学んだという事実に違いはありませんが、状況によって使い分けはしています。しかし、後進の人に自分が読んだ本を薦めるという、真面目な事情で話をするときは(いや営業での会話も真面目な事情には違いないのですが)、手順を追って説明するので自然と話が長くなってしまいます。「これがいいよ」「おおこれか、サンクス」といった無愛想なやり方でも通用するくらい素養がある人なら、そもそも他人に勉強の仕方など聞いたりはしないでしょう*。
* 例えば PHP を勉強したいという人がいたとします。目的や動機は色々あるでしょう。デザイナーさんやコーダーさんなら、業務で問い合わせフォームをつくるときに、処理系も自分で実装できるようになりたいという人は、少なからずいるでしょう。プログラマさんなら、既に Perl や C は書けるが PHP も使えるようになっておきたいと考えるかもしれません。ディレクターさんや営業さんなら、教養としておおよそのケイパビリティを知っておきたいという動機で学ぶ人もいると思います。かように様々な事情に合わせて、自分の体験から本を選ぶ必要があるので、あるていど話をして相手のことも分からなければ、マッチすると思う本を選べません。
もし相手がデザイナーさんやコーダーさんであり、業務として限られた目的のために、実践的なプログラミングを短期間で習得したいという欲求があれば、「サンプルコード集」のような本を勧めればよいと思うかもしれません。しかし、これらの本はプログラミング言語の制御構造や変数の型といったシンタクスを既知として書かれている場合が多く、実践的だからといっていきなりそれを初心者に勧めるのは無謀です。逆に言って、コピペだけで PHP を実装したいという程度の人なら、他人に勉強方法など聞かないでしょう。とは言え、言語のシンタクスの解説に詳しい本を薦めても、ルールは分かったけれど具体的にどうプレーして良いか分からないという、競技者のようになってしまいます(というか、圧倒的多数の人はプログラミング言語のシンタクスなど大して習得に困っているわけではなく、実際にどこから初めて、どう組むかを考えあぐねているのだと思った方がよいと思います)。
僕がはじめて読んだ本
そのような場合、プログラムを組むために必要最低限のシンタクスを解説してある本を薦めます。サンプルはシンタクスを理解するために必要なだけ掲載されていればよく、逆に多すぎると、初心者は「構文を覚えること」と「関数や宣言を覚えること」の区別がつかず、関数のあまりの多さで途方に暮れてしまい易いと思います。実際のところ、僕にしてもそうですが PHP の関数など半分くらいしか使いませんし、試しに使ってみたことすらない関数もたくさんあります(例えば DB 系の関数は対応するデータベースを使っていなければ、まず使いません。使うことになれば、たぶんフレームワーク独自の DB 用ヘルパを使うでしょう)。
『PHP入門 – 関数からデータベース連携まで』(藤本 壱/著, エーアイ出版, 2001)は、PHP を業務で書くことになったとき、はじめて手に取った本でした。もちろん他にも何冊か出ていましたが、Perl を学んだときの経験から、まずは概要を(不正確でも包括的でなくてもいいから)飲み込んでしまう方がよいと思って、薄い本を選びました。Perl を初めて学ぼうとしたとき、もともと僕は体系的かつ包括的に書かれている大部の本を好むので、ご多分に漏れずオライリーのラクダ本を真っ先に買ったのです。しかし、結局は『初めての Perl – Win32システム』の方で一通りの習得を終えました。そして必要に応じてラクダ本を読むか、あるいは『PERL クイックリファレンス』で済ませたのです。大部の体系的な本は、それだけを仕事にしているなら読み込んでおく必要もあるでしょうが、専任のプログラマでもない人が最初に読む本ではないと思います(初心者にオライリーの分厚い本や Unleashed シリーズあるいは WROX の P2P シリーズを薦めるような人は、教育的に配慮しているというよりも自意識過剰=そういう本をいきなり読んだ人として尊敬して欲しいのだと言えるでしょう)。
『PHP入門』は出版年度が2001年ですから、PHP 4.1.x 系すら出ていなかった時期に書かれた本です。従って、現在は既に役目を終えたと認識してよい筈です。その理由として、PHP6 では使えなくなる ereg 系の正規表現しか書かれていないとか、セキュリティについて殆ど書かれていないといった致命的な点もありますし、技術書には鮮度というものがあるという理由にもよります。もちろん、制御構造や型などバージョンがどれほど新しくなっても大きく変わらない部分はありますが、そもそも「そのプログラミング言語のコアはどこなのか」を、体系的に理解する前から当たりをつけられる初心者がいるとは思えません。それに、古い本にそのような当たりをつけて、現在も使える部分だけを読むといった面倒な真似を、初心者がしなければならない理由などないと思います。
リファレンス本や関数辞典について
プログラミング言語について最新の情報を簡単に押さえておくなら、誰が何を言おうと、公式に作成されているオンライン・マニュアルを越えるものはないでしょう。書物はいったん形になれば、その瞬間から風化していかざるをえません。他の言語に違わず、PHP でもオンライン・マニュアルは習得のベースになります。ただし、通勤・通学の行き帰りに頭の中で抽象コードを組み立てるような練習をするなら、オンラインのリソースに頼らずリファレンス本を一冊だけ持っておく方がよいです*。
* ここで「一冊だけ」と強調したのは、「自分に合う」ものを探し続けることはたいてい無益だからです。まず、リファレンス本はむやみやたらと出版されるものではありませんから、いま書店やアマゾンで売っているものから最適なものを選び、不足している情報はオンライン・マニュアルなどを見て書き込むか付箋に書いて挟めばよいでしょう。実際、特に PHP のリファレンス本に言えることですが、もともと収録している関数が極端に少ないものや、関数の引数や戻り値が間違って記述されているもの、あるいは意味もなく重要な関数(特にネットワーク関数)を除外しているものなど、お薦めできかねるものが多いです。
一冊だけリファレンス本を持つなら、これまで僕が手に取ってみた感想から選ぶと、次の3冊のどれかがよいと思います。
左はオライリーのデスクトップリファレンスで、これは手元に置くリファレンスとしてオーソドックスなものです。僕は長らくこれを使っていたのですが、逆にこれしかなかったという事情もありました。現在は他にもたくさんリファレンスがありますので、サンプルコードや関数がたくさん載っているものを所望するなら、他のものをおすすめします。中央は今年になって第2版が出た辞典です。「よく使う関数」を集めたとのことで、根拠ははっきりしませんが、堅実な選択がされていると思います。いつも思うのですが、 PHP のリファレンスってなんでいつもネットワーク関数や HTTP 関数が少ないんでしょうね。
それから、右端は php|architect という雑誌の出版社から出ているもので、但し書き付きでご紹介します。中身は関数の意味を短く説明し引数と戻り値が書いてあるだけです。どちらかと言えばタイポ(ど忘れ)対策のリファレンスにも思えますが、収録されている関数の量が多く、出版された2005年11月時点のマニュアルに収録されていた関数は、ほぼ全て網羅していると思われます。しかし約190ページの分量に詰め込んでいるため、文字が小さくて関数の具体的な使い方が書かれていないため、初心者がこれを見ながらプログラムを書くのは不可能に思えます。あくまでも自習用の参考書をセットにして、学んだ関数に印でもつけて利用するのが望ましいと思います。僕はこれをメインに使っていますが、引数の書式を忘れやすい関数は付箋をつけて補強していっています。
制御構造や関数を覚えるだけ?
僕が他の人を見ていて感じるのは、やはりあるていどアルゴリズムのような形式的議論やネットワークについて学んでいなければ、ウェブアプリケーションをいちからきちんと組むのは難しいだろうということです。サンプルなどを下敷きにして書いていれば、確かに「動くもの」は作れるようになりますが、サンプルに書いてないこと(たいていはセキュリティ対策)ができない、チューニングできない、応用できない、酷い場合はクックブックやリファレンス本が手元にないと書けないという悲惨な結果に至る場合もあります。関数の 100 や 200 は、職業としてプログラムを組むなら覚えて当たり前ですが、それ以外にも処理を設計してゆこうとする志向がなければならないと思います。コーダーさんとして組み立てる仕事を目指すなら別ですが、プログラムを自分で組みたいと思うなら、やはり制御構造や関数を覚えるだけではだめでしょう。
しかし、何でも自力で書けばよいものではありません。なぜなら、たいていの初級~中級のプログラマが書くコードは、どのみちロクなものではないからです(たぶん僕もこの部類でしょう)。ちなみに、僕は初級と中級を分けるときは、「本やオンラインマニュアルを参照しないで、ユーザ登録と読み書きができる簡単な掲示板を開発できるかどうか」という基準を使っています。中級と上級を分けるときは、「PHPそのもののソースコードを理解できるかどうか」を基準にしており、C 言語で書かれた PHP の動作原理を理解していなければ上級ではないと思っています。したがって、僕は Zend Certified Engineer の資格を持っていますが、C 言語で書かれた PHP の動作原理は理解していないので、まぎれもない中級と言ってよいでしょう(笑。逆に言うと、ZCE は中級レベルの試験であって、これをパスしたくらいで PHP について偉そうに語れるものではないということになります。(だから今回は控えめでしょう?)
制御構造や関数だけではなく、もう少しベースの動作原理まで解説してある本というのは、非常に少ないです。それでも一読に値する本があって、例えば、
『PHP4でつくるWebアプリケーション』(トビアス・ラチチュラー、ティル・ガーケン/著, 玉川竜司/訳, パソン・エデュケーション, 2001)という本は、PHP3からPHP4への移行期にあたる2000年に原書が出版されているのですが、ひととおり文法や関数を学んだ後に読むと、いまでも得るものは多いはずです。もう少し高度なものを読みたい方は、
これの第5章「Zend エンジン拡張性」か、更に進んで、
この書物が Zend エンジンの内部を詳しく知るための手引きとなるでしょう。もちろんこの本はC言語を理解していなければ読めませんので、ご注意下さい(これを読むことが PHP の勉強としては一つの目標なので、所持してはいますが、抽象コードのレベルで理解しているだけなのでかなり怪しい)。
PHP4は捨てるべきか
いま入門書を薦めるときに選択の余地を感じるのがこのテーマです。もちろん職業プログラマーを目指す人には、PHP4 と PHP5 の両方を解説してある本を薦めます。公式のサポートが一区切りついたとは言え、まだまだレンタルサーバやホスティングあるいはデータセンターで動いているウェブサーバは、PHP4 で書かれたウェブアプリケーションを動かさざるをえないと言って良いでしょう。恐らく、簡単に移行はできないと思われますので、PHP6が登場しても三つのバージョンが平行して使われることになるかもしれません。
こういう状況なので、PHP5にフォーカスを当てている本は、その人が PHP5 で運用されているサーバ上だけでプログラムを組むなら問題はないのですが、通常の受託業務でプログラムを組む人にはお勧めできません。そのような本は、既に PHP4 で開発をしてきた人が PHP4 との異同を確認するために読むか、バージョンの違いを気にしなくてもよい(PHP5 のサーバしか使わないような選択ができる)、いわゆる日曜プログラマに読んでいただければ有効かと思われます。
そういう前提を置いた上でご紹介すると、PHP5 を扱っている本としては、入門書は、
これを挙げておきます。もちろん、「マンモス本」と呼ばれる本もよい本なのですが、僕は PHP4 のマンモス本(赤・青)を一読しただけなので、PHP5 までは読んでいないため、お薦めしていいかどうか判断がつきません。でも、たぶん問題ないと思います。上記のオライリー本は手堅くまとまっている上に、演習問題がていねいな解答も合わせて付いているので、ざっと PHP5 の概要を理解したい場合はこちらがよいでしょう。ただし、いつも注釈が必要なのは残念ですが、セキュリティについてはあまり書かれていないので、別途セキュリティの本を読む必要があろうかと思います。
中級向けであれば、
これは分厚くてワクワクします。オブジェクト指向といったおきまりの話題だけでなく、PEAR や SQLite との連携なども扱っていて、読み応えがあります。取り上げているテーマにいささか偏りがあるような気もするのですが、CMSを作りたい人などにピッタリかもしれません。WAP対応ページの出力についても書かれています。
それから、特に PHP5 による設計手法に関心がある方は、これもいろいろと出ているのですが、
これと、
これは押さえておくとよいです。『Professional PHP5』は、おなじみ WROX(インプレスが何冊か翻訳を出していて、PHP4 を対象にした『プロフェッショナル PHP』は標準的なできばえの本でした)のシリーズですね。この本では、特に設計という観点から UML やデザインパターンを多用しています。後者の一冊は更にデザインパターンへ焦点を合わせた本なので、「デザインパターン」と言えば Java か C++ の本しかないと思っている方には、よい参考書となるでしょう。なお、上記を読んだ後で
という本も出たので、書店にてサラッと見てみましたが、両方読む必要はないです。
さあ、セキュリティだ!
ということで、脆弱なウェブアプリケーションの事例に枚挙のいとまがない PHP ですが、これには恐らく二つの大きな理由があろうと考えています。一つは、ネットワーク通信(特に HTTP や CGI といった通信のルールとか仕様)そのものに対する無知とか無関心です。ウェブサーバの動作やプロトコルに無関心でプログラムを書くというのは、まるで HTML の書き方を知らないでデザインをやっているのと同じで、職業というよりは芸術と言ってよいでしょう。プログラミングで糧を得るつもりなら、下のレイヤーについても理解が必須と言えます。そういう意味で、情報処理技術者試験のテクニカルエンジニア(ネットワーク)に焦点を当てたテキストや参考書に、受験するしないはともかく目を通すことが望まれます(僕も別に試験は受けていません)。
「二つ」と言っておいてもう一つ書くのを忘れてました(笑。もう一つの理由は・・・あれ、何だっけ? ああ、そうそう。二つめは、「セキュリティ対策」という表現があるように、大多数の初心者プログラマはセキュリティを「おおよそ開発が終わった後に仕方なく実装する、回りくどいルーチンの類」としか認識していません。これはつまり、大多数のプログラミングの本がセキュリティをそのようなものとして扱っているからであり、初心者に責めを負わせるよりもプロの書き手に責任があると言えます。したがって、
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>テスト</title>
</head>
<body>
<p><?php echo $_POST[ 'input' ]; ?>さん、こんばんは</p>
</body>
</html>
といったようなコードと五十歩百歩の、愚かと言ってもよい事例で説明するしか方法がないのかどうか、プロの書き手にはもう少々の検討をお願いしたいところです。
これまで僕が目を通したセキュリティ関連の書籍としては、まず次のようなものがあります。
これは特に PHP を扱っているわけではありませんが、攻撃と防御の考え方について学べます。また、アプリケーションそのものだけでなく、ソースコードへのアクセス権管理やサーバルームへの入退室管理といった幅広いテーマも扱っており、さすが KCCS(京セラコミュニケーションシステム)の人が書いたものだけあって、関心させられます。
PHP に的を絞って読むなら、まずは
でしょうか。とにかく薄い本なので、まずはこれを一読されることをおすすめします。但し、薄すぎるという点で少しばかり不安を感じることと、著者のシフレットさんは Hardened-PHP との有名な論争(罵り合い?)で知られているように、決してセキュリティグルの主流というわけでもないようです。したがって、セキュリティ情報の集め方全般に言えることですが、なるべくたくさんの情報を比較することが大切かと思います。という理由で、
これらの本も、会社で買ってもらうとか気になるところだけ(ジュンク堂みたいに、店内でじっくり読める環境があるとよいのですが)読んで確認するなどすればよいでしょう。もし攻撃や防御のパターンをたくさん知りたいのであれば、
この本か、あるいは『セキュアWebプログラミングTips集』(アマゾンの画像がない・・・ソフト・リサーチ・センター/刊)がよいでしょう。もっと異なるたくさんの攻撃パターンを紹介している本は他にもありますが、結局は原理原則を押さえることが優先すると思います。パターンを増やしていこうとすれば、ウェブアプリケーション側だけでは済まず、OS やウェブサーバのバグをバージョン毎に知っているとか、そういうところにまで行くことになるでしょう。結局のところ、そうした脆弱性は防御側の理屈ではアップデートで解決することなのですから、わざわざ弱いサーバを探して攻撃する気でもなければ、そこまで細かく追いかける必要はありません。
もうちょっと簡単なものは・・・
で、ここまででかなりハードルが高いという方には、例えば
こういった本もあるのですが(そして、実はこのシリーズは C# 以外は殆ど読んでたりする<笑)、これだけでプログラミングを始めるというのは、かなり無謀な気がするため、やはり一通り学んで書いている人に教えてもらいながら読んだ方がいいでしょう。経営者や営業担当者あるいはウェブディレクターの方が教養としてサラッと読むなら、十分に面白いと思います。
試験対策について
それから、ZCE をもっていることで聞かれるのは試験対策の本なのですが、
この二冊だけです。左は問題集で、右は試験のガイドとなります。但し、現在は PHP5 の試験にアップデートされているので、右の本は
をチェックするとよいでしょう。内容は、もちろん PHP についてひととおり解説されていますから、復習がてらに一つずつ確認してゆくのもよいと思います。意外にまんべんなく学んでいない場合もあって、どうしても業務の内容に応じて偏りが出てくるものです。それから、試験についてのアドバイスや受験の手順も書いてありますので、これらも参考になるでしょう。
問題集の方は、もちろん受験までに最低でも2周して解いてみなければ買った意味がないと思います。薄い本なので、毎日1時間ずつとして3日くらいで解けると思います。あとは高校や大学の受験と同じ要領ですから、悩まずに解けた問題は付箋紙で隠したりして、間違った問題だけ改めて解くとか、そういった工夫をすれば、受験の1ヶ月前に準備を始めても十分と言えます。実際、僕はガイドを一通り読んでから、問題集をじっくり1ヶ月くらいかけて解いたり読み返したりしたので、2ヶ月くらい準備に使いました。とは言え、中級の上といったあたりの人なら、いきなり受験しても大丈夫だと思います。ちなみに、実際に受験された方はお分かりと思いますが、この試験は関数をたくさん覚えることもさることながら、それぞれの関数の引数と戻り値を正確に理解していることがキモとなります。
最後にフレームワークについて
最後にフレームワークの本をご紹介しておきます。自分のお薦めのフレームワークの本を、と言いたいところですが、いちばん使いやすくて好みの CodeIgniter の本はこれから出るそうなので、それを参照してください。それ以外で使ったことがあるフレームワークは、実は Zend Framework くらいしかありません。そんなにフレームワークは多用していないです。それに、ZF もユーザーマニュアルと API マニュアルを使っていますので、書籍で読んだものは LL フレームワーク Books シリーズの、
くらいをざっと読んだていどです。たぶん使おうと思ってもすぐには使えません。フレームワークについてはまた書く機会があると思うのですが、これはとにかく手に馴染ませたものがベースになると思うので、いろいろと使い分けられたらよいのかもしれませんが、寧ろ使い分けはプログラム言語そのものの方がよいと思います。せいぜいフレームワークは「堅いもの(ZF か Symfony か Ethna)」「会社の規定(あれば)」それから「お気に入り(マイナーなのも可)」の三つくらいを扱えればよいでしょう。それ以上たくさん知っていても、業務上は単なる趣味でしかないです。他のプログラム言語を使える方がよほどいい。
このような次第で、また長々と書籍のお話をしたわけですが、全くの初心者には書籍とアドバイスというのが最強なのかと思うのです。やはり自分でもそうだったのですが、独学だと覚えることに偏りが生じやすいので、アドバイスしてくれる人が近くにいなければ、[PHP-Users] に雑談みたいなメールを投げる前に、Coderz とか PHPClasses といったサイトを利用して、自分が参考にしたい処理内容と近いコードを探して、他の人が書いたコードを読むことをお薦めします。やはり書籍に載っているサンプルコードは、飽くまでもサンプルです。実際に使われているコードを見て参考にすると、なんでこんな書き方をしているのかという疑問を通じて、プログラミングそのものについても理解が深まるかと拝察するのであります。