書籍概要

パーフェクト

パーフェクトPHP

著者
発売日
更新日

概要

1冊で言語仕様から最新の技術までを網羅した内容。網羅的に解説されているだけでなく,各技術に関しては基本からしっかり解説し,フレームワークなどを利用したWebアプリケーション開発の解説などは,内部処理が裏で何をしているのかを掘り下げて解説してあるため,PHPを体系的に学びたい方はもちろん,より深い知識を得たい中~上級者にもお勧めの一冊である。

こんな方におすすめ

  • PHPで仕事をしているエンジニア
  • PHPでWebアプリケーション開発をしているエンジニア

目次

Part-1 PHP ~overview

1章 PHP概論

1.1 PHPとは
  • 1.1.1 PHPとは
  • 1.1.2 PHPの歴史
  • 1.1.3 本書の概要
  • 1.1.4 コーディングスタイル
1.2 Webアプリケーションの仕組み
  • 1.2.1 WebサーバとWebブラウザ
  • 1.2.2 インストールとドキュメントルートの設定
  • 1.2.3 Linux(CentOS/Fedora)
  • 1.2.4 Linux(Debian/Ubuntu)
  • 1.2.5 Mac OS X
  • 1.2.6 Windows
  • コラム Skypeを利用している場合の注意点
  • 1.2.7 ドキュメントルートの設定確認
  • 1.2.8 ソースからのインストール
1.3 PHPの処理の流れ
  • 1.3.1 モジュールとCGI
  • 1.3.2 CLI
  • 1.3.3 コンパイルと実行

Part 2 PHPの言語仕様

2章 PHPの基本

2.1 基本的な構文
  • 2.1.1 サンプルプログラム
  • 2.1.2 PHPブロック
  • 2.1.3 文
  • 2.1.4 コメント
  • 2.1.5 出力
  • 2.1.6 echo文とvar_dump()関数
  • 2.1.7 識別子
  • 2.1.8 予約語
  • 2.1.9 エラー
2.2 変数
  • 2.2.1 PHPの変数
  • 2.2.2 可変変数
  • 2.2.3 変数のスコープ
  • 2.2.4 定義済み変数
  • 2.2.5 スーパーグローバル変数
2.3 定数
  • 2.3.1 定数定義
  • 2.3.2 constants()関数
  • 2.3.3 定義済み定数
2.4 エラー
  • 2.4.1 エラーとは
  • 2.4.2 エラーの種類とエラー定数
  • 2.4.3 例外
  • 2.4.4 エラーに関する設定

3章 型と演算子

3.1 型
  • 3.1.1 PHPの型
  • 3.1.2 整数
  • 3.1.3 浮動小数点
  • 3.1.4 文字列
  • コラム 比較演算を行う場合の注意点
  • 3.1.5 論理型
  • 3.1.6 配列
  • 3.1.7 オブジェクト
  • 3.1.8 リソース
  • 3.1.9 null
  • 3.1.10 型変換
3.2 演算子
  • 3.2.1 PHPの演算子
  • 3.2.2 三項演算子
  • 3.2.3 演算子の優先順位
  • 3.2.4 その他の演算子
3.3 配列
  • 3.3.1 PHPの配列
  • 3.3.2 配列の初期化
  • 3.3.3 連想配列
  • 3.3.4 多次元配列
  • 3.3.5 PHPの配列の特徴のまとめ
  • 3.3.6 配列の演算

4章 制御構造と関数

4.1 制御構造
  • 4.1.1 プログラムの構成要素と制御構造
  • 4.1.2 if-elseif-else
  • 4.1.3 制御構造に関する別の構文
  • 4.1.4 while
  • 4.1.5 do-while
  • 4.1.6 for
  • 4.1.7 foreach
  • 4.1.8 break
  • 4.1.9 continue
  • 4.1.10 switch
  • 4.1.11 return
  • 4.1.12 exit
  • 4.1.13 require/require_once
  • 4.1.14 include/include_once
  • 4.1.15 goto
4.2 関数
  • 4.2.1 関数の基本
  • 4.2.2 関数の定義
  • 4.2.3 関数の呼び出し
  • 4.2.4 参照による引数と返り値
  • 4.2.5 無名関数
  • 4.2.6 定義済み関数

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

5.1 クラス
  • 5.1.1 PHPのクラス
  • 5.1.2 クラスの定義
  • 5.1.3 プロパティ
  • 5.1.4 定数
  • 5.1.5 メソッド
  • 5.1.6 コンストラクタとデストラクタ
  • コラム PHP 4とPHP 5のコンストラクタ
  • 5.1.7 継承
  • 5.1.8 標準クラスとキャスト
  • 5.1.9 抽象クラス
5.2 インターフェイス
  • 5.2.1 インターフェイスの定義と実装
  • 5.2.2 定義済みインターフェイス
  • 5.2.3 インターフェイスのチェック
5.3 クラスとオブジェクトの機能と特徴
  • 5.3.1 マジックメソッド
  • 5.3.2 遅延静的束縛
  • 5.3.3 オートロード
5.4 名前空間
  • 5.4.1 PHPの名前空間
  • 5.4.2 名前空間の定義
  • 5.4.3 インポートルール
  • 5.4.4 名前解決
5.5 例外
  • 5.5.1 PHPの例外
  • 5.5.2 定義済みの例外
  • 5.5.3 例外の拡張
  • 5.5.4 PHPのエラーと例外
5.6 参照
  • 5.6.1 参照とは
  • 5.6.2 参照変数の扱い
  • 5.6.3 オブジェクトの参照
  • コラム PHP 4のオブジェクトの参照
  • 5.6.4 リファレンスカウントとオブジェクトの寿命
  • 5.6.5 変数のリファレンスとコピーオンライト

Part 3 実践Webアプリケーション

6章 Webアプリケーション入門

6.1 Webアプリケーション概要
  • 6.1.1 Webアプリケーションとは
  • 6.1.2 HTMLとフォーム
  • コラム PHPの標準関数
  • 6.1.3 HTTPメソッド
  • 6.1.4 HTTPメソッドの使い分け
  • 6.1.5 スーパーグローバル変数
6.2 ひとこと掲示板作成
  • 6.2.1 アプリケーション概要
  • 6.2.2 データベースの作成
  • 6.2.3 テーブルの作成
  • 6.2.4 アプリケーションを配置するディレクトリの作成
  • 6.2.5 コメント投稿フォームの作成
  • 6.2.6 保存処理
  • 6.2.7 エラーメッセージ出力
  • 6.2.8 投稿されたひとことの表示
  • 6.2.9 投稿後のリダイレクト
6.3 レガシーPHPからの脱却
  • 6.3.1 レガシーPHPコード
  • 6.3.2 ロジックとビューの分離
  • 6.3.3 役割に応じたファイルの分割
6.4 さらなる役割の分割
  • 6.4.1 役割の分割と共通化
  • 6.4.2 フレームワーク

7章 フレームワークによる効率的な開発

7.1 開発の流れ
  • 7.1.1 フレームワークとは
  • コラム オープンソースのフレームワーク
  • 7.1.2 開発効率の向上
  • 7.1.3 フレームワークとオブジェクト指向
7.2 フレームワーク作成
  • 7.2.1 フレームワークの要件
  • 7.2.2 MVCモデル
  • 7.2.3 フレームワークの構造
  • 7.2.4 フレームワークの処理の流れ
  • 7.2.5 ディレクトリ構成
  • 7.2.6 クラスとオートロード
  • 7.2.7 ClassLoaderクラス
  • 7.2.8 bootstrap.php
  • コラム bootstrap.phpの配置場所について
  • 7.2.9 フロントコントローラと.htaccess
  • 7.2.10 Requestクラス
  • 7.2.11 ベースURLとPATH_INFO
  • 7.2.12 RequestクラスでのURL制御
  • 7.2.13 ルーティング
  • 7.2.14 Routerクラス
  • 7.2.15 Responseクラス
  • 7.2.16 データベースアクセスとPDO
  • 7.2.17 DbManagerクラス
  • 7.2.18 DbRepositoryクラス
  • 7.2.19 Sessionクラス
  • 7.2.20 Applicationクラス
  • 7.2.21 コントローラの呼び出しと実行
  • 7.2.22 例外の活用
  • 7.2.23 コントローラとビュー
  • 7.2.24 Controllerクラス
  • 7.2.25 Controller::run()メソッド
  • 7.2.26 ビューの仕組み
  • 7.2.27 Viewクラス
  • 7.2.28 Controller::render()メソッド
  • 7.2.29 Controllerクラスとリダイレクト
  • コラム リダイレクトのステータスコード
  • 7.2.30 CSRF対策
  • 7.2.31 ログイン状態の制御
  • 7.2.32 フレームワークの完成

8章 ミニブログアプリケーション開発

8.1 設計とセットアップ
  • 8.1.1 アプリケーション概要
  • 8.1.2 機能一覧
  • 8.1.3 コントローラ設計
  • 8.1.4 ミニブログアプリケーションの作成
  • コラム レンタルサーバを使う場合
  • コラム ドメインとアンダースコア
  • 8.1.5 データベースの作成
  • 8.1.6 MiniBlogApplicationクラス
  • コラム データベースとユーザ
  • 8.1.7 フロントコントローラの書き換え
  • 8.1.8 レイアウトビューファイルの作成
8.2 ユーザ登録機能作成
  • 8.2.1 アクションの作成手順
  • 8.2.2 ユーザ登録とデータベースアクセス
  • 8.2.3 Repositoryクラスの役割
  • 8.2.4 UserRepositoryクラス
  • コラム パスワードのハッシュ化
  • 8.2.5 ユーザIDからレコードを取得する処理
  • 8.2.6 signupアクション
  • 8.2.7 登録処理の流れ
  • 8.2.8 registerアクション
  • 8.2.9 ビューファイルの修正/signupAction()メソッドの修正
8.4 ホームページと投稿
  • 8.4.1 StatusRepositoryクラス
  • 8.4.2 indexアクション
  • 8.4.3 ビューファイルの共通化
  • 8.4.4 postアクション
8.5 ユーザの投稿一覧と投稿詳細
  • 8.5.1 StatusRepositoryクラスの拡張
  • 8.5.2 ルーティング定義とリンクの記述
  • 8.5.3 userアクション
  • 8.5.4 showアクション
8.6 アカウント情報管理とログイン
  • 8.6.1 アカウント情報の実装
  • 8.6.2 indexアクション
  • 8.6.3 signinアクション
  • 8.6.4 authenticateアクション
  • コラム ログイン時のバリデーションエラーメッセージ
  • 8.6.5 signoutアクション
  • 8.6.6 レイアウトにナビゲーションを追加
  • 8.6.7 ログイン状態のみ有効なアクションの制御
8.7 フォロー
  • 8.7.1 フォローとは
  • 8.7.2 FollowingRepositoryクラス
  • 8.7.3 フォローボタン
  • 8.7.4 followアクション
  • 8.7.5 フォローしているユーザの表示
  • 8.7.6 フォローしているユーザの投稿表示
8.8 デザインの修正
  • 8.8.1 デザインの改善点
  • 8.8.2 おわりに

Part 4 PHPセキュリティ

9章 PHPで作るWebアプリケーションのセキュリティ(前編)

9.1 セキュリティ概説
  • 9.1.2 Webアプリケーションとセキュリティ
  • 9.1.3 セキュリティ基礎知識
9.2 スクリプト挿入攻撃(Script Insertion)
  • 9.2.1 スクリプト挿入攻撃とは
  • 9.2.2 脆弱性
  • 9.2.3 対応方法
9.3 クロスサイトスクリプティング(Cross Site Scripting/XSS)
  • 9.3.1 クロスサイトスクリプティングとは
  • 9.3.2 脆弱性
  • 9.3.3 対応方法
9.4 クロスサイトリクエストフォージェリ(Cross Site Request Forgeries/CSRF)
  • 9.4.1 クロスサイトリクエストフォージェリとは
  • 9.4.2 脆弱性
  • 9.4.3 対応方法
9.5 SQLインジェクション(SQL Injection)
  • 9.5.1 SQLインジェクションとは
  • 9.5.2 脆弱性
  • 9.5.3 対応方法
9.6 セッション固定攻撃
  • 9.6.1 セッション固定攻撃とは
  • 9.6.2 脆弱性
  • 9.6.3 対応方法
  • コラム セッションIDに利用できる文字と文字数
9.7 セッションハイジャック
  • 9.7.1 セッションハイジャックとは
  • 9.7.2 脆弱性
  • 9.7.3 対応方法

10章 PHPで作るWebアプリケーションのセキュリティ(後編)

10.1 HTTPヘッダインジェクション
  • 10.1.1 HTTPヘッダインジェクションとは
  • コラム HTTPヘッダインジェクションについて
  • 10.1.2 脆弱性
  • 10.1.3 対応方法
10.2 メールの第三者中継
  • 10.2.1 メールの第三者中継とは
  • 10.2.2 脆弱性
  • 10.2.3 対応方法
10.3 変数汚染攻撃
  • 10.3.1 変数汚染攻撃とは
  • 10.3.2 脆弱性
  • 10.3.3 対応方法
10.4 Nullバイト攻撃
  • 10.4.1 Nullバイト攻撃とは
  • 10.4.2 脆弱性
  • 10.4.3 対応方法
  • コラム POSIX互換正規表現関数を使っている際の注意点
10.5 ディレクトリトラバーサル
  • 10.5.1 ディレクトリトラバーサルとは
  • 10.5.2 脆弱性
  • 10.5.3 対応方法
10.6 eval利用攻撃
  • 10.6.1 eval利用攻撃とは
  • 10.6.2 脆弱性
  • 10.6.3 対応方法
10.7 ファイルアップロード攻撃
  • 10.7.1 ファイルアップロード攻撃とは
  • 10.7.2 脆弱性
  • 10.7.3 対応方法
10.8 インクルード攻撃
  • 10.8.1 インクルード攻撃とは
  • 10.8.2 脆弱性
  • 10.8.3 対応方法
  • コラム インクルードファイルの拡張子
10.9 パス・ディスクロージャ
  • 10.9.1 パス・ディスクロージャとは
  • 10.9.2 脆弱性
  • 10.9.3 対応方法
10.10 コマンド実行攻撃(Command Injection)
  • 10.10.1 コマンド実行攻撃とは
  • 10.10.2 脆弱性
  • 10.10.3 対応方法
10.11 サーバ設定
  • 10.11.1 PHPの設定
  • 10.11.2 Apacheの設定

Part5 テクニカルなPHPの活用

11章 実践オブジェクト指向

11.1 PHPとオブジェクト指向
  • 11.1.1 オブジェクト指向の活用
  • 11.1.2 Standard PHP Library(SPL)
11.2 マジックメソッド
  • 11.2.1 マジックメソッドとは
  • 11.2.2 __construct()メソッド/__destruct()メソッド
  • 11.2.3 __get()メソッド/__set()メソッド
  • 11.2.4 __isset()メソッド/__unset()メソッド
  • 11.2.5 __call()メソッド/__callStatic()メソッド
  • 11.2.6 __sleep()メソッド/__wakeup()メソッド
  • 11.2.7 __toString()メソッド
  • 11.2.8 __invoke()メソッド
  • 11.2.9 __clone()メソッド
11.3 配列オブジェクト
  • 11.3.1 配列オブジェクトとインターフェイス
  • 11.3.2 Iteratorインターフェイス
  • 11.3.3 IteratorAggregateインターフェイス
  • 11.3.4 ArrayAccessインターフェイス
  • 11.3.5 SPLのクラス/インターフェイス
11.4 例外
  • 11.4.1 例外処理
  • 11.4.2 SPL例外
11.5 PDO
  • 11.5.1 データベースアクセスの抽象化
  • 11.5.2 PDO
  • 11.5.3 接続
  • 11.5.4 問い合わせ処理
  • 11.5.5 結果セットと取得メソッド
  • 11.5.6 結果セットとフェッチモード
  • 11.5.7 更新処理
  • 11.5.8 プリペアドステートメント
  • 11.5.9 トランザクション
  • 11.5.10 エラー処理
11.6 オートロード
  • 11.6.1 オートロードとは
  • 11.6.2 __autoload()関数
  • 11.6.3 SPLとオートロード
11.7 名前空間
  • 11.7.1 名前空間とクラス名のルール
  • 11.7.2 オートローダを作成する

Part 6 PHPレシピ

12章 レシピことはじめ

12.1 PHPマニュアルの歩き方
  • 12.1.1 PHPのマニュアル
  • コラム 日本語のマニュアルに関するコミュニティ
  • 12.1.2 PHPマニュアルの読み方
  • 12.1.3 PHPマニュアルの様々な利用法
  • 12.1.4 検索
12.2 PHPの設定
  • 12.2.1 PHPの設定とは
  • 12.2.2 設定の変更
  • 12.2.3 推奨の設定
  • 12.2.4 PHPの主な設定

13章 標準機能

13.1 文字列
  • 13.1.1 文字列に対する操作
  • 13.1.2 変数をフォーマットする
  • 13.1.3 数値をフォーマットする
  • 13.1.4 HTMLタグをエスケープする
  • 13.1.5 改行を
    タグに変換する
  • 13.1.6 文字列の長さを調べる
  • 13.1.7 文字列の一部を切り出す
  • 13.1.8 配列を文字列として連結する
  • 13.1.9 文字列の両端から不要な空白文字を除去する
  • 13.1.10 大文字や小文字の変換をする
  • 13.1.11 URL文字列を解析する
  • 13.1.12 文字列を丸める
  • 13.1.13 全角・半角を変換する
13.2 文字コード
  • 13.2.1 文字コードに対する操作
  • 13.2.2 文字コードの設定
  • 13.2.3 文字コードを変換する
13.3 配列
  • 13.3.1 配列に対する操作
  • 13.3.2 配列の要素の追加と削除
  • 13.3.3 配列の要素を並び替える
  • 13.3.4 配列の要素数を得る
  • 13.3.5 文字列を分割して配列にする
  • 13.3.6 配列の要素を複数の変数へ代入する
  • 13.3.7 配列を結合する
  • 13.3.8 配列のキーをすべて取得する
  • 13.3.9 配列に値が含まれるか調べる
  • 13.3.10 配列を指定した値で埋める
  • 13.3.11 配列の一部を切り出す
  • 13.3.12 配列のすべての要素にコールバックを適用する
  • 13.3.13 配列の要素をコールバックでフィルタする
13.4 正規表現
  • 13.4.1 PCREとPOSIX拡張
  • 13.4.2 PCRE正規表現構文
  • 13.4.3 preg_match
  • コラム その判定,わざわざ正規表現を使う必要があるの?
  • コラム メールアドレスと正規表現
  • 13.4.4 preg_match_all
  • 13.4.5 preg_replace
  • 13.4.6 preg_split
  • 13.4.7 preg_quote
  • 13.4.8 mb_ereg

14章 ライブラリとフォーマット

14.1 ライブラリの利用
  • 14.1.1 PHPのライブラリ
  • 14.2.2 PEAR
  • コラム PEAR 2
  • 14.2.3 PECL
  • 14.2.4 APC
  • 14.2.5 Xdebug
14.3 メール
  • 14.3.1 PHPでのメール送信
  • 14.3.2 mail()関数
  • コラム メールのセキュリティ
  • 14.3.3 mb_send_mail()関数
  • 14.3.4 ライブラリを利用したメールの扱い
14.4 日付と時間
  • 14.4.1 日付と時間の注意点
  • 14.4.2 DateTimeクラス
  • 14.4.3 タイムゾーンを指定する
  • 14.4.4 DateIntervalクラス
  • 14.4.5 日付の差の計算・加算・減算をする
  • 14.4.6 日付に対して繰り返し演算を実行する
  • 14.4.7 date()などの関数
14.5 ファイルとディレクトリ
  • 14.5.1 ファイルとディレクトリに対する操作
  • 14.5.2 ファイルの内容を文字列として取得する
  • 14.5.3 文字列をファイルに保存する
  • 14.5.4 SplFileObject
  • 14.5.5 ファイル一覧の取得
  • 14.5.6 ファイルやディレクトリの操作
  • 14.5.7 様々なチェック・情報取得関数
14.6 XML
  • 14.6.1 PHPとXML
  • 14.6.2 SimpleXMLオブジェクト
  • 14.6.3 変更・追加・XMLとして取得
  • 14.6.4 名前空間付きのノードの取得
  • 14.6.5 SimpleXMLの弱点
14.7 データフォーマット
  • 14.7.1 シリアライズ
  • 14.7.2 JSON

Appendix

  • App-A PHPコンパイルオプション
  • App-B php.ini

サポート

ダウンロード

本書に関するサンプルファイルをダウンロードできます。

データは,圧縮ファイル形式でダウンロードできます。圧縮ファイルをダウンロードしていただき,適宜解凍してご利用ください。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2012年8月20日更新)

P.022 上から7行目付近 (3刷修正済み)

CentOS/Fedoraでは/etc/php/php.iniがphp.iniファイルになります
CentOS/Fedoraでは/etc/php.ini がphp.iniファイルになります

P.024 真ん中のインストール (3刷修正済み)

Mac OS Xではportコマンドからインストールします

----
$ sudo port install php5
$ sudo port install php5-devel php5-mbstring php5-mysql
$ sudo port mysql5-server
----

Mac OS Xではportコマンドからインストールします

----
$ sudo port install php5
$ sudo port install php5-devel php5-mbstring php5-mysql
$ sudo port install mysql5-server
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
$ sudo sh -c "echo 'Include conf/extras-conf/mod_php.conf' >> /opt/local/apache2/conf/httpd.conf"
----

P.083 「PHP Notice~~」のリストの前,下から3行目

この例の場合、3つのい要素が
この例の場合、3つ要素が

P.198 7.1本文1行目

本章ではフレームワークの作成と、それを用いたWebアプリケーションの作成を行います。
本章と次章ではフレームワークの作成それを用いたWebアプリケーションの作成を行います。

P.201 下から5行目付近

アプリゲーションごとに
アプリーションごとに

P.202 図7.1(3刷修正済み)

Settion
Session

P.237 リスト7.15 run() メソッド内のif文(3刷修正済み)


if ($param === false) {


if ($params === false) {

P.312 リスト8.32 3行目 (3刷修正済み)


class AccountController extends Controller


class StatusController extends Controller

P.339~341 9.4.3 対応方法 (3刷修正済み)

http://www.tokumaru.org/d/20110127.htmlで脆弱性指摘あり。修正済みコードは以下からダウンロードできます。

P.359 本文 下から5行目

 +document.cookie;</script>
 %2Bdocument.cookie;</script>

P397 本文 上から5行目

 file=../../../../../../../etc/passwd%00
 design=../../../../../../../etc/passwd%00

P.389 リスト10.21 (3刷修正済み)


eval("echo htmlspecialchars(str_replace(" . $_GET['keyword'].
    ",'', ".$string."), ENT_QUOTES, 'UTF-8');");


eval("echo htmlspecialchars(str_replace('" . $_GET['keyword'].
    "','', '".$string."'), ENT_QUOTES, 'UTF-8');");

P.389 本文 上から3行目 (3刷修正済み)

 ところが、このプログラムに「?keyword=phpinfo()」とつけてアクセスすると、phpinfo()関数の結果が表示されてしまいます。これは、$_GET['keyword']の値「phpinfo()」がeval()関数によって実行されてしまうためです。
 ところが、このプログラムに「?keyword='.phpinfo().'」とつけてアクセスすると、phpinfo()関数の結果が表示されてしまいます。これは、$_GET['keyword']の値に含まれている「phpinfo()」がeval()関数によって実行されてしまうためです。

P.389 リスト10.22 (3刷修正済み)


if (strpos($string, $_GET['keyword']) !== false) {
    eval("echo htmlspecialchars(str_replace(".$_GET['keyword'].
        ",'', ".$string."), ENT_QUOTES, 'UTF-8');");
}


if (strpos($string, $_GET['keyword']) !== false) {
    eval("echo htmlspecialchars(str_replace('".$_GET['keyword'].
        "','', '".$string."'), ENT_QUOTES, 'UTF-8');");
}

P.405 リスト 10.38のファイル名


 command_injection_04.php


 command_injection_03.php

商品一覧