こんにちは、blog登場3回目のnakazawa-kです。書きかけのAndroid記事よりも先になってしまったのですがせっかく献本を頂戴したということで、発売日にはレビューを載せたいなと思い少々駆け足で読んだ「パーフェクトPHP」社内回し読み2人目の書評(?)です。 本にどのようなことが書かれているか、についてはAmazonに掲載されている目次でも見ていただけば大体分かると思いますので、ここでは「どんな人が読むと、どんなことが得られそうか」「nakazawa-k的に気になったトピック」を主に取り上げます。他の切り口は社内外の他の方にお譲りします。 一言でざっくりまとめると「PHPでプログラムを書く人、書いている人は斜め読みでもよいので一読すると、抜けているポイントを補間出来たり、自分の理解度を把握することが出来るので是非読むべき」という感じです。この本から得るものは何も無いという方は、それはそれでひとつの指標として捉えられるのではないでしょうか。その上で、PHPからしばらく遠ざかっていたけれどまた書くことになった、という時にでも『PHPのクセ』を思い出すためのツールとして有効なのではないかな、と考えています。 以下、より具体的に書いていきます。 第二部、PHPの言語仕様については、既にPHPを用いてアプリケーション開発を行っている方もざっと一読をお薦めします。何か抜けている箇所があるかもしれません。PHPは詳細な仕様をきちんと認識していなくてもコードをガリガリ書くと案外動作してしまうので、場合によってはずっと知らないままになってしまうかもしれません。言語仕様をきっちりと把握していないと思わぬところでハマったり、再現性の悪いバグに悩まされたりします。一度整理しておくのは非常に有意義でしょう。 第三部、第四部、第五部は「PHPでWebサービスを作り始め、ひとまずゴリ押しで動かすにはどうするのか、その後保守しやすくPHP的にあるべき姿へとコードを変更するためにはどのようにすべきか、サービスとして公開するにあたりどのような点に注意を払いセキュリティを保つべきであるのか」という、サービス開発者の成長フローとも言えるものをまとめています。 特に第7章からのWebサービス向けフレームワーク設計と実際のディレクトリレイアウトやコードへの落とし込みと、それを用いたアプリケーション構築までを、ある程度思考フローを追いかけて記載されている部分は「フレームワークを使ってるけど、それらがどのように実装されているのか、そしてそれはなぜなのかは分からない。知りたい」という意識を持たれている方はステップアップのために是非読まれることをお薦めします。コンパクトでそこそこ使いやすいフレームワークをPHPで構築するためにどのような要素が必要か、どの程度柔軟性を持たせるべきか、どのようなことに注意を払う必要があるのか、という思考をある程度追体験することが出来るように思います。 終盤の章はPHPに慣れていない人に「こういうのがあるんだー」と、とりわけ文字列操作や配列操作関数がやたらと充実していることを知ってもらうための章立てです。実際にコードを書く段階になって既存関数を自分で書かずに済み、取り組むべきロジックに注力出来る、という意味で有用ですが、既にPHPをある程度触っている人は「何か、知らないものないかな」とざっくり眺める程度でOKでしょう。 ちなみにこのあたりはリファレンス的な内容であることも影響していると考えられますが、多少失速してしまった感があります。他の章についているPHP5.3以降対応の注記が無くなってしまっている(例えばDateIntervalは5.3から、DateTimeクラス自体は5.2にもあるがDateTime::diff()は5.3から)ので、実際に記載の関数/メソッドを使われる際には、リファレンスで確認されることをお薦めします。12章冒頭で書かれているように「PHPのマニュアルはよく出来てる、ちゃんと読もう」ということです。 蛇足ながらPHP5.2.xは現状予定では5.2.15で終了、ということになっています。つまり、そろそろPHP5.3.xへの移行を本格的に考えるべき時期に来ているのですが、まだまだ世の中のサーバでPHP5.3.xが使えない環境が多い上に既存5.2用コードの一部が動作しないことを考えると、依然としてバージョンごとの関数/メソッドサポートについては気を使う必要があります。
= 雑多なトピック = PHP5.2.xな世界に居る人から見たPHP5.3.xの魅力 ・三項演算子の省略記法 $result = func() ? func() : 'default'あるいは$result = ($ret = func()) ? $ret : 'default';と書かざるを得なかったコードが $result = func() ?: 'default'; と書けるようになった。これは幸福度高いです。 ・無名関数 説明不要ですね。使い方によってはコードがカオスになる懸念はありますが、便利にさっくり書ける場面が増えそうです。 ・Nowdoc
$var = <<<'EOM'
text
text
EOM;
シングルクォートでバウンダを指定するという記法がとても残念な感はあるのですが、式を書けない場所にも変数展開無しヒアドキュメント(残念ながら、私はほぼ使わない)を置けるのは嬉しい人がいそうな感じです。一方、constにarrayを定義出来ると嬉しいのですが、残念ながらそれはPHP6.0まで対応されません(6.0の話はやめろーという声が聞こえてきそう)。 本書でも記載されている自動キャストの挙動は様々なところでネタにされているように、PHPでエンバグの原因になる要素のひとつです。厳密比較のほうが速度的なメリットも得られるのですが、全てを厳密比較で行うためにはある程度入力時のキャスト等に労力をかける必要があるため、正しい知識を持った上で場合によって使い分ける必要があります。 本書中に可変変数など、様々な便利機構が記載されていますが、それらについてどの程度コストがかかるかという点については触れられていないので、自ら計測する必要があります。これは処理前後でのmicrotime()を用いた時間計測(実際には数十万回ループにすると思いますが)および使用前後でのmemory_get_usage()を用いた(あるいはXdebugでのトレース出力)メモリ消費量計測によって簡単に取得出来るので、新しい仕組みを使ってコードを書く際には習慣付けると良いでしょう。 本書のコラムにてPHPに限らず、ある言語自体のソースコードが手元にある場合、それをよく知るための良い手掛かりとしてテストコードを読む、というのが挙げられています。PHPのテストコードはPHP自身で書かれていることが多いため仮にCが読めなくとも取っつきやすい、ということです。未知のものに対するアプローチとして面白いものだと感じ、実践してみようと思います。 うっかり知識から抜けていたポイント。 foreachにて要素参照を使うことが出来る。
foreach ($list as &$elem){
}
で参照をそのまま使える。ただし、ブロックを抜けた後での変数破壊コードを埋め込んでしまう恐れもあるため、ループ抜けたらunsetしておくのが無難。外部ソースから取得した配列データを事前に型変換した上でAPCに放りこむ、などの用途で便利ですね。
$list = fetch_data();
foreach($list as &$element){
    $element['id'] = (int)$element['id'];
}
...

勝手に正誤表(既に指摘されてるのを知っている箇所は除いているので完全なリストではありません) 意味的なものではなく、表記的なもののみ。 p.267:設定するして→設定して p.279:処理が完了ら→処理が完了したら p.309:ログイン状態のみ→ログイン状態でのみ、が一般的かな p.373:RFCに準拠しないも→RFCに準拠しないアドレスも