『PHP逆引きレシピ 第2版』は何が変わったのか?改訂ポイントをまとめてみるよ

おそらくPHP関連のレシピ集の中でもっとも評価の高い『PHP逆引きレシピ』の改訂版が10/21に翔泳社より発売されました。

間違いなくPHPの書籍の中でNO.1の一冊です。
http://www.amazon.co.jp/review/RDSZUNDEME14R/ref=cm_cr_rdp_perm?ie=UTF8&ASIN=4798119865&linkCode=&nodeID=&tag=
(初版へのAmazonでのレビューより)

今日は、この初版をご存じの方に、第2版の改訂ポイントをまとめてみました。

『PHP逆引きレシピ』とは?

PHP言語を日々実践の場で利用している方々へ贈る、必須のレシピ集であり、また初級レベルのPHP開発者が中級レベルを目指すために必要な秘訣やヒントを一杯詰め込んだ、便利な逆引き本です。

以下のコンセプトの元に作成されました。

  • プログラミング実践上の実用レシピ集
  • PHP初級者を中級者にレベルアップする
  • プログラミング時に「困ったな」という状況に遭ったときに、その躓きやトラブルを”自力解決”できる本
  • 本当に実用度が高い、厳選した使用頻度の高いテクニックを掲載
  • 本当に開発時に必要なものを取り上げる

初版は2009年6月に発売されました。

脱初心者の為の1冊
何冊か入門本を購入して学習しましたが、次に何をすればよいのだろうというのがわかりませんでした。 この本の目次を読んだだけで、PHPで出来るの事の理解の幅がすごく広まりました。 初心者の方は目次を読むだけでもPHPでできる事が参考になるかも。
http://www.amazon.co.jp/review/R2ZGMAXUAIZBTX/ref=cm_cr_pr_perm?ie=UTF8&ASIN=4798119865&linkCode=&nodeID=&tag=
(初版へのAmazonでのレビューより)

改訂の概要

かつての良書も今や糞本
2009年頃はこの本がPHPの本の中で一番優れていたと思うが、今やこの本を買ってPHPに取りかかろうものなら、PHPのバージョンアップの激しさにプログラムが動かなくなるのは時間の問題。特にmysql関数は早急にPDOに改めるべき。名前空間があればなおよいが。また、テストコードが全く書かれていないことが残念だ。
http://www.amazon.co.jp/review/R2WZ31R4EFULKU/ref=cm_cr_rdp_perm?ie=UTF8&ASIN=4798119865&linkCode=&nodeID=&tag=
(初版へのAmazonでのレビューより)

恐らく初版のサンプルの多くが現在の最新のPHP 5.5でも動作すると思います。しかし、PHPの進歩は著しく、多くの新しい機能が追加されており、サンプルコードとしては古くなってしまったり、今ドキではなくなっているものが含まれることは確かです。

発売から4年も経っているため、ある意味やむを得ないのですが、今回の改訂のポイントを一言で言えば、初版のコンセプトはそのままに

『PHP逆引きレシピ』を「今ドキ」なものにアップデートする

ということになります。ちなみに、上記のAmazonのレビューで言及されている点はすべて第2版でカバーされています。

すべてのレシピは再検討されています

詳細な目次だけを比べると、あまり変わっていないように思うかもしれませんが、すべてのレシピは再検討されており、少なくともXHTMLからHTML5にコードが変更されています。

そして、PHPコードも必要なアップデートが多くのレシピでなされています。

章立ては以下のように、必要な新しい章や節を追加し、改訂されています。

.

初版第2版

.

第1章 準備第1章 準備

.

1.1 サーバー環境 1.1 サーバー環境

.

1.2 開発環境 1.2 開発環境

.

1.3 本番環境

.

.

第2章 PHPの基本構文第2章 PHPの基本構文

.

2.1 変数 2.1 変数

.

2.2 定数 2.2 定数

.

2.3 条件分岐 2.3 条件分岐

.

2.4 繰り返し処理 2.4 繰り返し処理

.

2.5 関数 2.5 関数

.

2.6 ファイルのインクルード 2.6 ファイルのインクルード

.

2.7 エラー処理 2.7 エラー処理

.

.

第3章 PHPの基本テクニック第3章 PHPの基本テクニック

.

3.1 文字列 3.1 文字列

.

3.2 数値 3.2 数値

.

3.3 日付時刻 3.3 日付時刻

.

3.4 配列 3.4 配列

.

3.5 PHPの設定 3.5 PHPの設定

.

3.6 ベンチマーク 3.6 ベンチマーク

.

3.7 コマンドライン

.

.

第4章 ファイルとディレクトリ第4章 ファイルとディレクトリ

.

4.1 ファイル 4.1 ファイル

.

4.2 ディレクトリ 4.2 ディレクトリ

.

4.3 PDFファイル 4.3 PDFファイル

.

4.4 CSVファイル 4.4 CSVファイル

.

4.5 画像ファイル 4.5 画像ファイル

.

4.6 グラフ

.

.

第7章 クラスとオブジェクト第5章 クラスとオブジェクト

.

7.1 クラスの基礎 5.1 クラスの基礎

.

5.2 クラスの活用

.

5.3 名前空間

.

5.4 例外処理

.

5.5 SPL

.

.

第5章 PEARとSmarty第6章 ライブラリ

.

5.1 PEARの使い方 6.1 PEARの使い方

.

6.2 Composerの使い方

.

5.2 Smartyの使い方 6.3 Smartyの使い方

.

6.4 フレームワーク

.

.

第6章 Webプログラミング第7章 Webプログラミング

.

6.1 フォームの基礎 7.1 フォームの基礎

.

6.2 フォームの実際 7.2 フォームの実際

.

6.3 入力データの加工 7.3 入力データの加工

.

7.4 データ出力時の処理

.

6.4 Cookie 7.5 Cookie

.

6.5 セッション 7.6 セッション

.

6.6 ファイルアップロード 7.7 ファイルアップロード

.

6.7 メール処理 7.8 メール処理

.

6.8 ネットワーク 7.9 ネットワーク

.

6.9 HTTPヘッダー 7.10 HTTPヘッダー

.

6.10 データベース(MySQL)

.

7.11 Web API

.

6.11 その他 7.12 その他

.

.

第8章 データベース

.

8.1 phpMyAdmin

.

8.2 データベース(PDO)

.

.

第9章 自動テスト

.

9.1 ユニットテスト

.

9.2 ブラウザテスト

.

.

第8章 セキュリティ第10章 セキュリティ

.

8.1 セキュリティ対策の基本 10.1 セキュリティ対策の基本

.

8.2 PHPの設定 10.2 PHPの設定

.

8.3 セキュリティ対策 10.3 セキュリティ対策

.

.

第9章 トラブルシューティング第11章 トラブルシューティング

.

9.1 エラー表示など 11.1 エラー表示など

.

9.2 文字化け 11.2 文字化け

.

.

第10章 アプリケーション編

.

10.1 phpMyAdmin

.

10.2 WordPress

.

10.3 MyNETS

ページ数の関係で、初版の「第10章 アプリケーション編」は削除せざるを得ませんでしたが、そこに記載されていたレンタルサーバに関する多くのことは、第2版では「1.3 本番環境」や「8.1 phpMyAdmin」に移動して残っています。

主な改訂ポイント

対応PHPバージョン

初版は、PHP 4/5.2/5.3対応でしかも、5.3はサンプルが動作するだけでした。しかし、今ドキにアップデートされた第2版では、PHP 5.3以降を対象としており、PHP 5.3/5.4/5.5対応で、5.3の新機能はもちろん、5.4、5.5の新機能についても必要と思われるものを追加しています。

Eclipse/PDTからNetBeansへ

PHP初級者の方にとって総合的にみて、NetBeansのほうがとっつきやすいだろうとの判断から、IDEをNetBeansに変更しました。ただし、IDEを前提とした書籍ではありませんのでEclipseや他のIDE/エディタのユーザだと役に立たないということは全くありません。

また、NetBeansによるステップ実行でのデバッグ方法(リモートデバッグ)の解説も加えました。

オブジェクト指向の解説の強化

PHPでのオブジェクト指向の普及に合わせて、オブジェクト指向に関するレシピを大幅に増やしました。以下のレシピが追加されています。

  5.2 クラスの活用
    158 静的メソッド、静的プロパティって何ですか?  
    159 オートロードって何ですか?  
    160 「self::」「parent::」「static::」とは何ですか?  
    161 クラス内で定数を使用したい  
    162 マジックメソッドって何ですか?  
    163 オブジェクトを保存したい  
    164 タイプヒンティングとは何ですか?  
    165 抽象クラスとは何ですか?  
    166 インターフェイスとは何ですか?  
  5.3 名前空間
    167 名前空間とは何ですか?  
    168 名前空間の記述を短くしたい  
  5.4 例外処理
    169 例外処理とは何ですか?  
    170 複数の例外を分けて処理したい  
    171 通常のエラーを例外で処理したい  
  5.5 SPL
    172 SPLって何ですか?  
    173 オブジェクトを配列のように扱いたい  
    174 イテレータって何ですか?  

また、Composerの基本的な使い方やフレームワークの紹介も加えました。

データベース

データベースに関しては、初版では古い環境をサポートするためにMySQL(MySQL関数)だったため、

PHP逆引きレシピは概ね良いが、SQLインジェクションに関しては残念なことに
http://d.hatena.ne.jp/ockeghem/20090711/p1

とのご指摘を受けましたが、今回はPHP 5.3以降ということで、PDOを使いMySQLおよびSQLiteで動作するようにすべて書き直し、きちんとプリペアドステートメントを使うようにしています。

Web API/JSON/XML

初版では扱いがなかった、Web API、JSON、XMLに関するレシピも追加されています。

  7.11 Web API
    240 JSON形式のデータを返すWeb APIを作りたい  
    241 RSSやXML文書を解析したい  
    242 JSON形式のデータを返すWeb APIを利用したい  

テスト

また、自動テストとして、PHPUnitでの、ユニットテストとSeleniumを使ったブラウザテストについてのレシピも追加しました。

ボリュームアップしてさらにお得感もアップ

第2版では、ページ数がさらに増えています。

初版 第2版 増加率 増加数
レシピ数 261 315 +20.7% +54レシピ
ページ数 768 896 +16.7% +128ページ

しかし、価格は200円アップの2800円(+消費税)です。

そして、

最後の索引ページを強化してくれたらもっとよかったです。
http://www.amazon.co.jp/review/R20KNB0E0ZETP2/ref=cm_cr_rdp_perm?ie=UTF8&ASIN=4798119865&linkCode=&nodeID=&tag=
(初版へのAmazonでのレビューより)

という不満にも対応し、索引数はほぼ倍増しています。

初版 第2版 増加率 増加数
索引数 916 1,743 +90.3% +827語

余談ですが、たぶん、これだけのページ数のPHPの書籍が出せるのは今回が最後だと思います。 書店で見かけたら、是非、手に取ってその重さ厚みをお確かめください。

実は、この第2版は900ページ越えの予定で作成しておりました。しかし、再校校正の最中に出版社の社内会議でページ数が多すぎるということで決裁が通らず、まさかの再校でページ数を減らすという事態に陥りました。

ページ数を19ページ減らし、ようやく出版にこぎつけました。

本当にすばらしい本になりました

私が言うのもなんですが、初版もかなりの品質の本でしたが、この第2版の品質は初版をはるかに超えていると思います。

細部までものすごく手が込んでいます。初版と同じく3つのレンタルサーバでサンプルの動作を確認している点はもちろん(他にもWindows/Mac/Linuxでも動作確認しています)、記述自体はさらっとしていますが、実は、PHPのソースコードまで追っかけて確認していることもあります。

執筆中に発見したPHPやPHPマニュアルのバグを報告したのも一度や二度ではありません。 6人の執筆者が10か月近くかけただけのことはある内容です。

すべての初版の読者に自信を持ってお薦めできる書籍に仕上がりました。書店で見かけられましたら、是非、手に取ってみてください。

ちなみに、この『PHP逆引きレシピ』は初版もそうですが、名古屋発祥の本です。

関連

Tags: php, book

FuelPHP 1.7がリリースされました

バグ修正および機能追加と改良を含むFuelPHP 1.7が10/14にリリースされました。

すべてのFuelPHPユーザは1.7へアップグレードすることが推奨されますが、既存のアプリをアップグレードする前に、Changelogで変更点をチェックしておきましょう。

なお、FuelPHP 1.7は1.x系の最後のリリースバージョンになります。今後の開発はFuelPHP 2.0のみに移りましたので、今後は、1.x系へはバグ修正のPull Requestのみが受け付けられます。

1.7へのバグ修正は1.8/developブランチに送信してください。1.8/developブランチは、1.x系の保守のために作成されたブランチです。

主な変更点

セキュリティ関連の修正は、すでに公表済みのFuelPHP 1.6.1 以下へのセキュリティ勧告(脆弱性)に対する修正のみです。

目についた変更点を以下にピックアップしました。1.7は大きな変更はなく、バグ修正と小さな機能追加が主です。詳細は、Changelog v1.7を参照してください。

  • Authパッケージの多数のバグ、特にOpAuthやOrmauthドライバに関するものが修正されました。
  • Ormパッケージの多数のバグ、特にModel_SoftとModel_Nestedsetに関するものが修正されました。
  • Twitter Bootstrapは3.0にアップグレードされました。
  • リバースルーティングで正規表現のルートを使えるようになりました。
  • DBは、アプリケーションから完全に透過的なマスター/スレーブ設定をサポートしました。
  • CSRFトークンの隠しフィールドをフォームに追加するためのForm::csrf()メソッドが追加されました。
  • Langクラスに、言語データをデータベーステーブルに格納するドライバが追加されました。
  • Pagination::render()にレンダリングされたHTMLではなく、生のページネーションデータを返すオプションが追加されました。
  • Validation Errorオブジェクトから、すべてのまたは個々のエラーメッセージを取得するValidation::get_error_message()が追加されました。

『はじめてのフレームワークとしてのFuelPHP』

FuelPHP 1.7対応の追加情報が出ています。詳細は、以下のサポートサイトの「追加情報」を参照願います。

FuelPHP 1.7 翻訳ウィーク

FuelPHP 1.7のリリースに合わせて、公式ドキュメントの翻訳を加速するためのイベント、「FuelPHP 1.7 翻訳ウィーク」が開催されています。

バグ情報

バグに関する情報は、以下を参照願います。

関連

Tags: fuelphp, release

PHPで静的サイトを簡単に作成できるSculpin

Sculpinという静的サイト生成ツールがあります。Jekyllをご存じの方はそれのPHP版とお考えください。

ただし、SculpinはJekyllの不満点を解消するために作成されたそうですので、Jekyllよりすごいのかも知れません。が、私はJekyllを知らないので実際の違いはわかりません。

何より、PHPで作成されているので、PHPが動作する環境ですぐに使うことができ、生成されたHTMLファイルをサーバに転送するだけでサイトを更新できます。

Sculpinの特徴

  • PHPによる静的サイト生成ツール
  • ブログを運営できる
  • Markdownでコンテンツを記述できる
  • テンプレートはTwig
  • PHP 5.3.2以降が必要(PHP 5.4以降が便利)

Sculpinのインストール

まず、以下のsculpin-blog-skeltonをダウンロードします。これは、ブログを始めるにあたってのサンプルファイルです。

ダウンロードして展開すると、以下のようなフォルダ構成になっています。

app/config/に設定ファイルが、source/にコンテンツが配置されます。

sculpin-blog-skeleton-master/
├── README.md
├── app
│   └── config .... 設定ファイルを配置
│       ├── sculpin_kernel.yml
│       └── sculpin_site.yml
└── source ......... コンテンツを配置
    ├── _posts ..... ブログの記事を配置
    ├── _views ..... レイアウトのテンプレートを配置
    ├── about.md ... Aboutページ
    ├── blog
    │   ├── categories
    │   │   └── category.html ... Categoryページ
    │   ├── categories.html
    │   ├── tags
    │   │   └── tag.html
    │   └── tags.html
    ├── blog.html
    ├── css
    │   └── style.css
    ├── favicon.ico
    └── index.html

続いて、Sculpin本体をインストールします。Pharが提供されていますので、それをダウンロードするのが簡単でしょう。sculpin-blog-skeltonのトップフォルダに置いてください。

最後に、sculpin-blog-skeletonに必要なコンポーネント(bootstrap など)をインストールします。ここは、phpコマンドが必要になります。

$ php sculpin.phar install

これで、インストールが完了しました。

CLIによるインストール

コマンドラインやGitが好きな方は、以下の4行でインストール完了です。

$ git clone git@github.com:sculpin/sculpin-blog-skeleton.git
$ cd sculpin-blog-skeleton/
$ curl -O -k https://download.sculpin.io/sculpin.phar
$ php sculpin.phar install

Sculpinの設定

Sculpinの設定ファイルは、以下の2つです。

sculpin_kernel.ymlにはブログのpermalinkの設定がありますが、特に変更する必要はないでしょう。

sculpin_site.ymlでブログのタイトルとサブタイトルを設定します。

Google Analyticsを使う場合は、ここで以下のようにIDを設定します。

title: A Day in Serenity (Reloaded)
subtitle: PHP, FuelPHP, Linux or something
google_analytics_tracking_id: xxxxx

テンプレート

source/_views/以下にテンプレートが配置されています。

default.htmlは、ページ全体のHTMLのテンプレートになっています。Twigテンプレートです。必要に応じて変更します。

ページコンテンツ

ページコンテンツのサンプルとして

が含まれています。必要に応じて変更し、不要なら削除します。

ブログ記事

source/_posts/以下に記事のサンプルがいくつか含まれています。

記事のファイル名は、以下のフォーマットになり、Markdownで記事を書くことができます。

  • source/_posts/YYYY-MM-DD-文字列.md

年別のサブフォルダを作成し、以下のようなファイル名も使えそうだったんですが、バグなのかうまく動作しませんでした。テキトーに修正してPRしておきました。

  • source/_posts/YYYY/MM-DD-文字列.md

なお、上記の「文字列」に「.」(ドット)は使えません。

記事ファイルの先頭には、以下のようなメタ情報をYAMLで記載します。

---
layout: post
title: Symfony Live Hacking Day!
tags: [sensio, symfony, symfony live]
categories: [personal]

---

layoutは使用するテンプレートの指定で_views/post.htmlを使用するという意味になります。

titleは記事のタイトル。tagscategoriesはタグとカテゴリの指定です。

なお、以下のように記述すると、その記事はドラフトになり本番用のサイト生成では出力されなくなります。

draft: true

サイトの生成

以下のコマンドで開発用のサイトがoutput_dev/以下に生成されます。

$ php sculpin.phar generate

Sculpinはデフォルトでは開発用のサイトを生成します。ブログのドラフトの記事も生成されます。

生成されたサイトの確認

生成されたサイトは、PHP 5.4以降ならPHPのビルトインWebサーバで簡単に確認することができます。

以下のコマンドは、サイトを生成し、ビルトインWebサーバを起動します。また、コンテンツの変更を監視し、変更された場合、自動的に更新します。

$ php sculpin.phar generate --watch --server

http://localhost:8000/にアクセスすれば、生成されたサイトを確認できます。

本番環境へのデプロイ

本番用のサイトを生成するには、--envオプションでprodを指定します。

$ php sculpin.phar generate --env=prod

これで、output_prod/にサイトが生成されます。output_prod/以下のファイルをサーバに転送すればデプロイは完了です。

もし、URLが合わない場合は、--urlオプションで指定して変更することができます。

$ php sculpin.phar generate --env=prod --url=http://example.jp/blog

Shellとrsyncが使える環境では、sculpin-blog-skeletonに含まれるpublish.shが参考になります。

関連

参考

Tags: sculpin