プログラミングPHP 第3版

[cover photo]
  • 2014年03月 発行
  • 416ページ
  • ISBN978-4-87311-668-6
  • フォーマット Print PDF
  • 原書: Programming PHP, 3rd Edition

オライリー・ジャパンで書籍を購入:
定価4,104円

Ebook Storeで電子版を購入:
価格3,283円

ウェブアプリケーション開発の定番言語であるPHP言語を、言語仕様から実用的なプログラミングテクニックまで詳細に解説しています。PHP言語のコア機能である、強力な文字列処理や配列処理、改善されたオブジェクト指向プログラミングのサポートなどはもちろん、拡張モジュールと組み合わせてデータベースを使用したり、グラフを描画したり、XMLファイルを解析したりなど、実践的なテクニックも網羅しています。本書をマスターすれば、PHP言語の動作原理を理解して、PHPに付属する多くの拡張モジュールの使用方法を身に付け、自分でPHPのウェブアプリケーションを設計して作成できるようになるでしょう。PHP言語を扱うすべてのユーザのための本格的解説書です。

関連書籍

入門 PHPセキュリティ
初めてのPHP
初めてのPHP、MySQL、JavaScript&CSS 第2版

はじめに

1章 PHPについて
    1.1 PHPとは
    1.2 PHPの歴史
        1.2.1 PHPの誕生
        1.2.2 PHPの発展
    1.3 PHPのインストール
    1.4 PHPの例
        1.4.1 設定情報のページ
        1.4.2 フォーム
        1.4.3 データベース
        1.4.4 グラフィックス

2章 PHP言語の基本
    2.1 字句構造
        2.1.1 大文字 /小文字の区別
        2.1.2 命令文とセミコロン
        2.1.3 空白と改行
        2.1.4 コメント
        2.1.5 リテラル
        2.1.6 識別子
        2.1.7 キーワード
    2.2 データ型
        2.2.1 整数
        2.2.2 浮動小数点数
        2.2.3 文字列
        2.2.4 論理値
        2.2.5 配列
        2.2.6 オブジェクト
        2.2.7 リソース
        2.2.8 コールバック
        2.2.9 NULL
    2.3 変数
        2.3.1 可変変数
        2.3.2 変数への参照
        2.3.3 変数のスコープ
        2.3.4 ガベージコレクション
    2.4 式と演算子
        2.4.1 オペランドの数
        2.4.2 演算子の優先順位
        2.4.3 演算子の結合時の評価順
        2.4.4 暗黙のキャスト
        2.4.5 算術演算
        2.4.6 文字列連結演算子
        2.4.7 インクリメント演算子とデクリメント演算子
        2.4.8 比較演算子
        2.4.9 ビット演算子
        2.4.10 論理演算子
        2.4.11 キャスト演算子
        2.4.12 代入演算子
        2.4.13 その他の演算子
    2.5 フロー制御文
        2.5.1 if
        2.5.2 switch
        2.5.3 while
        2.5.4 for
        2.5.5 foreach
        2.5.6 try	catch
        2.5.7 declare
        2.5.8 exitとreturn
        2.5.9 goto
    2.6 外部のコードの読み込み
    2.7 ウェブページへの PHPの埋め込み
        2.7.1 標準の形式( XML形式)
        2.7.2 SGML形式
        2.7.3 ASP形式
        2.7.4 <script>タグ
        2.7.5 コンテンツを直接出力する方法

3章 関数
    3.1 関数の呼び出し
    3.2 関数の定義
    3.3 変数のスコープ
        3.3.1 グローバル変数
        3.3.2 スタティック変数
    3.4 関数のパラメータ
        3.4.1 値渡しのパラメータ
        3.4.2 参照渡しのパラメータ
        3.4.3 パラメータのデフォルト値
        3.4.4 可変パラメータ
        3.4.5 パラメータの省略
        3.4.6 タイプヒンティング
    3.5 返り値
    3.6 可変関数
    3.7 無名関数

4章 文字列
    4.1 文字列定数のクォート処理
        4.1.1 変数の展開
        4.1.2 シングルクォートで囲まれた文字列
        4.1.3 ダブルクォートで囲まれた文字列
        4.1.4 ヒアドキュメント
    4.2 文字列の表示
        4.2.1 echo
        4.2.2 print()
        4.2.3 printf()
        4.2.4 print_r()と var_dump()
    4.3 個別の文字へのアクセス
    4.4 文字列のお掃除
        4.4.1 空白の除去
        4.4.2 大文字 /小文字の変換
    4.5 エンコードとエスケープ
        4.5.1 HTML
        4.5.2 URL
        4.5.3 SQL
        4.5.4 C言語形式の文字列のエンコード
    4.6 文字列の比較
        4.6.1 完全一致
        4.6.2 類似性
    4.7 文字列の操作と検索
        4.7.1 一部の取り出し
        4.7.2 その他の文字列関数
        4.7.3 文字列の分解
        4.7.4 文字列の検索関数
    4.8 正規表現
        4.8.1 正規表現の基本
        4.8.2 文字クラス
        4.8.3 選択肢
        4.8.4 繰り返し
        4.8.5 サブパターン
        4.8.6 デリミタ
        4.8.7 マッチングの挙動
        4.8.8 文字クラス
        4.8.9 アンカー
        4.8.10 量指定子の貪欲さ
        4.8.11 キャプチャしないグループ
        4.8.12 後方参照
        4.8.13 後置オプション
        4.8.14 インラインオプション
        4.8.15 先読みと戻り読み
        4.8.16 無視
        4.8.17 条件式
        4.8.18 関数
        4.8.19 Perlの正規表現との違い

5章 配列
    5.1 インデックス配列と連想配列
    5.2 配列の要素の識別
    5.3 配列へのデータの格納
        5.3.1 配列の末尾への値の追加
        5.3.2 範囲指定による配列への代入
        5.3.3 配列の大きさの取得
        5.3.4 配列の要素の継ぎ足し
    5.4 多次元配列
    5.5 多次元配列の展開
        5.5.1 配列のスライス
        5.5.2 配列の分割
        5.5.3 キーと値
        5.5.4 ある要素が存在するかどうかのチェック
        5.5.5 配列の要素の削除と追加
    5.6 配列と変数との変換
        5.6.1 配列からの変数の作成
        5.6.2 変数からの配列の作成
    5.7 配列の順次処理
        5.7.1 foreach構文
        5.7.2 イテレータ関数
        5.7.3 forループの使用
        5.7.4 配列の各要素に対する関数の呼び出し
        5.7.5 配列の縮退
        5.7.6 値の検索
    5.8 配列のソート
        5.8.1 配列を一度にソート
        5.8.2 自然順でのソート
        5.8.3 複数の配列の一括ソート
        5.8.4 配列の逆転
        5.8.5 順番のランダム化
    5.9 配列全体に対する処理
        5.9.1 配列の和の計算
        5.9.2 2つの配列のマージ
        5.9.3 2つの配列の差の計算
        5.9.4 配列の要素のフィルタリング
    5.10 配列の使用法
        5.10.1 集合
        5.10.2 スタック
    5.11 Iteratorインターフェイス

6章 オブジェクト
    6.1 用語の定義
    6.2 オブジェクトの作成
    6.3 プロパティおよびメソッドへのアクセス
    6.4 クラスの宣言
        6.4.1 メソッドの宣言
        6.4.2 プロパティの宣言
        6.4.3 定数の宣言
        6.4.4 継承
        6.4.5 インターフェイス
        6.4.6 トレイト
        6.4.7 抽象メソッド
        6.4.8 コンストラクタ
        6.4.9 デストラクタ
    6.5 内部検査
        6.5.1 クラスについての調査
        6.5.2 オブジェクトについての調査
        6.5.3 内部検査のサンプルプログラム
    6.6 シリアライズ

7章 ウェブに関するテクニック
    7.1 HTTPの基本
    7.2 変数
    7.3 サーバーの情報
    7.4 フォームの処理
        7.4.1 メソッド
        7.4.2 パラメータ
        7.4.3 自己参照するページ
        7.4.4 固定フォーム
        7.4.5 複数選択形式のパラメータ
        7.4.6 複数選択パラメータの固定
        7.4.7 ファイルのアップロード
        7.4.8 フォームの入力チェック
    7.5 レスポンスヘッダの設定
        7.5.1 さまざまなコンテンツタイプ
        7.5.2 リダイレクト
        7.5.3 有効期限
        7.5.4 認証
    7.6 状態の管理
        7.6.1 クッキー
        7.6.2 セッション
        7.6.3 クッキーとセッションの組み合わせ
    7.7 SSL

8章 データベース
    8.1 PHPによるデータベースへのアクセス
    8.2 リレーショナルデータベースと SQL
        8.2.1 PHP Data Objects
    8.3 MySQLiオブジェクトインターフェイス
        8.3.1 表示用のデータの取得
    8.4 SQLite
    8.5 ファイルレベルの直接操作
    8.6 MongoDB
        8.6.1 データの取得
        8.6.2 もう少し複雑なデータの追加

9章 グラフィックス
    9.1 ページへの画像の埋め込み
    9.2 グラフィックについての基本概念
    9.3 画像の作成と描画
        9.3.1 画像処理プログラムの構造
        9.3.2 出力フォーマットの変更
        9.3.3 サポートする画像フォーマットの確認
        9.3.4 既存のファイルの読み込み
        9.3.5 基本的な描画関数
    9.4 画像とテキスト
        9.4.1 フォント
        9.4.2 TrueTypeフォント
    9.5 動的に作成するボタン
        9.5.1 動的に作成したボタンのキャッシュ
        9.5.2 より高速なキャッシュ
    9.6 画像の拡大 /縮小
    9.7 色の処理
        9.7.1 アルファチャネルの使用法
        9.7.2 色の特定
        9.7.3 フルカラー画像のインデックス
        9.7.4 テキスト形式での画像データの表示

10章 PDF
    10.1 PDF用の拡張モジュール
    10.2 ドキュメントとページ
        10.2.1 シンプルな例
        10.2.2 ドキュメントの初期化
        10.2.3 基本的なテキスト出力:セルの使用
    10.3 テキスト
        10.3.1 座標
        10.3.2 テキストの属性
        10.3.3 ページヘッダ、ページフッタ、そしてクラスの拡張
        10.3.4 画像とリンク
        10.3.5 表とデータ

11章 XML
    11.1 XMLとは
    11.2 XMLの作成
    11.3 XMLの解析
        11.3.1 要素ハンドラ
        11.3.2 文字データハンドラ
        11.3.3 処理命令
        11.3.4 エンティティハンドラ
        11.3.5 デフォルトのハンドラ
        11.3.6 オプション
        11.3.7 パーサーの使用法
        11.3.8 エラー
        11.3.9 メソッドのハンドラとしての使用法
        11.3.10 XML解析プログラムのサンプル
    11.4 DOMによる XMLの解析
    11.5 SimpleXMLによる XMLの解析
    11.6 XSLTによる XMLの変換

12章 セキュリティ
    12.1 入力のフィルタリング
    12.2 クロスサイトスクリプティング
        12.2.1 SQLインジェクション
    12.3 出力のエスケープ
        12.3.1 ファイル名
    12.4 セッションの固定化
    12.5 ファイルのアップロード
        12.5.1 ブラウザから渡されたファイル名を信用しない
        12.5.2 ファイルシステムへの格納時に注意する
        12.5.3 register_globalsの恐怖
    12.6 ファイルへのアクセス
        12.6.1 指定したディレクトリ以外へのアクセスを制限する
        12.6.2 最初にきちんとする
        12.6.3 ファイルを使わない
        12.6.4 セッションファイルの扱い
        12.6.5 PHPライブラリを隠す
    12.7 PHPのコード
    12.8 シェルのコマンド
    12.9 参考資料
    12.10 まとめ

13章 アプリケーションに関するテクニック
    13.1 コードライブラリ
    13.2 テンプレートシステム
    13.3 出力の処理方法
        13.3.1 出力バッファリング
        13.3.2 出力の圧縮
    13.4 エラー処理
        13.4.1 エラーの報告
        13.4.2 エラーの抑制
        13.4.3 エラーを意図的に発生させる
        13.4.4 エラーハンドラの定義
    13.5 パフォーマンスチューニング
        13.5.1 ベンチマーク
        13.5.2 プロファイリング
        13.5.3 実行時間の最適化
        13.5.4 メモリの使用量の最適化
        13.5.5 リバースプロキシとレプリケーション

14章 さまざまなプラットフォームでの PHP
    14.1 Windowsと Unixで共用できるコードの書き方
        14.1.1 実行環境の調べ方
        14.1.2 複数プラットフォームに対応するパス
        14.1.3 サーバー環境
        14.1.4 メールの送信
        14.1.5 改行コードの扱い
        14.1.6 ファイル終端の扱い
        14.1.7 外部コマンド
        14.1.8 プラットフォームに依存する拡張モジュール
    14.2 COMインターフェイスの使用
        14.2.1 背景知識
        14.2.2 PHPの関数
        14.2.3 APIの調べ方

15章 ウェブサービス
    15.1 RESTクライアント
        15.1.1 レスポンス
        15.1.2 リソースの取得
        15.1.3 リソースの更新
        15.1.4 リソースの作成
        15.1.5 リソースの削除
    15.2 XML-RPC
        15.2.1 サーバー
        15.2.2 クライアント

16章 PHPのデバッグ
    16.1 開発環境
    16.2 ステージング環境
    16.3 本番環境
    16.4 php.iniの設定
    16.5 手動でのデバッグ
    16.6 エラーログ
    16.7 IDEを使ったデバッグ
    16.8 デバッグについての応用テクニック

17章 日付と時刻
 
索 引

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

1刷正誤表

プログラミングPHP 第3版

2015年7月22日更新

位置
全体を
通じて
PHP_SELF
SCRIPT_NAME
p8
例1-1
<html>
  <head>
    <title>Look Out World</title>
  </head>

  <body>

    <?php echo "Hello, world!"; ?>

<html>
  <head>
    <title>Look Out World</title>
  </head>

  <body>
    <?php echo "Hello, world!"; ?>
  </body>
</html>
<html>
  <head>
    <title>Look Out World</title>
  </head>

  <body>

    <?php echo "Hello, world!"; ?>

  </body>
</html>
(赤字箇所6行削除。原書errataに従い修正)
p11
図1-5の
このサンプルデータベースのSQLは、library.sqlというファイルにあります。
このサンプルデータベースのSQLは、http://examples.oreilly.com/0636920012443/からダウンロードできます。
(原書errataに従い修正)
p25
下から
2番目の
コード片
0b01100000         // 10進形式では1
0b00000010         // 10進形式では2
-0b10              // 10進形式では-2
0b01100000         // 10進形式では96
0b00000010         // 10進形式では2
-0b10              // 10進形式では-2
(原書errataに従い修正)
p27
下から
8行目
echo "aとbは等しい"
echo "aとbは等しい";
(セミコロン追加。原書errataに従い修正)
p28
6番目の
箇条書き
●プロパティメソッドを一切含まないオブジェクト
削除
(原書errataに従い修正)
p31
一番下の
コード片
$callback = function myCallbackFunction()
{
    echo "コールバックに到達しました";
}
call_user_func($callback);
コールバックに到達しました
$callback = function () {
    echo "コールバックに到達しました";
};
call_user_func ( $callback );
コールバックに到達しました
(原書errataに従い修正)
p38
表2-3
下から
6、5行目
左側カラム
5    L   =
     L   +=、-=、…
5    R   =
     R   +=、-=、…
(原書errataに従い修正)
p40
最終行
"9 Lives." - 1;            // 8 (float)
"9 Lives" - 1;            // 8 (float)
(ピリオド削除。原書errataに従い修正)
p43
図2-7
下から
3、2行目
数値形式でない文字列   数値                   数値による比較
数値形式の文字列       数値形式でない文字列   辞書順による比較
数値形式でない文字列   数値                   辞書順による比較
数値形式の文字列       数値形式でない文字列   数値による比較
(原書errataに従い修正)
p72
1番目の
コード片
global $var;
$var = $GLOBALS['var'];
global $var;
$var =  & $GLOBALS['var'];
(&追加。原書errataに従い修正)
p85
一番下の
コード片
if (print("test")) {
  print("動いたよ!");
}
動いたよ!
if (print("test"\n)) {
  print("動いたよ!");
}
test
動いたよ!
(原書errataに従い修正)
p141
上方の
コード片
$callback = function printRow($value, $key)
{
  print("<tr><td>{$value}</td><td>{$key}</td></tr>\n");
};
$person = array('name' => "Fred", 'age' => 35, 'wife' => "Wilma");

array_walk($person, $callback);
$printRow = function ($value, $key)
{
  print("<tr><td>{$key}</td><td>{$value}</td></tr>\n");
};

$person = array('name' => "Fred", 'age' => 35, 'wife' => "Wilma");
echo "<table border=1>" ;
array_walk($person, $printRow);
echo "</table>" ;
(原書errataに従い修正)
p142
中央の
コード片
$callback = function addItUp($runningTotal, $currentValue)
{
  $runningTotal += $currentValue * $currentValue;

  return $runningTotal;
};

$numbers = array(2, 3, 5, 7);
$total = array_reduce($numbers, $callback);
echo $total;

87
$addItUp = function ($runningTotal, $currentValue)
{
  //echo $runningTotal . " " . $currentValue . "<br/>" ;
  $runningTotal += $currentValue * $currentValue;

  return $runningTotal;
};
$numbers = array(2, 3, 5, 7);
$total = array_reduce($numbers, $addItUp);

echo "<br/> TOTAL: " . $total;

87
(原書errataに従い修正)
p43
例5-2
例5-2 配列の検索
<?php
function hasRequired($array, $requiredFields)
{
  $keys = array_keys($array);

  foreach ($requiredFields as $fieldName) {
    if (!in_array($fieldName, $keys)) {
      return false;
    }
  }

  return true;
}

if ($_POST['submitted']) {
  echo "<p>あなたはすべての必須入力項目を";
  echo hasRequired($_POST, array('name', 'email_address')) ? "入力しました。" : "入力し
終えていません。</p>";
} ?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  <p>名前: <input type="text" name="name" /><br />
  メールアドレス: <input type="text" name="email_address" /><br />
  年齢(任意): <input type="text" name="age" /></p>

<p align="center"><input type="submit" value="送信" name="submitted" /></p>
</form>
例5-2 配列の検索
<?php
function hasRequired($array, $requiredFields) {
  $array =

  $keys = array_keys ( $array );
  foreach ( $requiredFields as $fieldName ) {
    if (! in_array ( $fieldName, $keys )) {
      return false;
    }
  }
  return true;
}
if ($_POST ['submitted']) {
  $testArray = array_filter($_POST);
  echo "<p>あなたはすべての必須入力項目を ";
  echo hasRequired ( $testArray, array (
      'name',
      'email_address'
  ) ) ? "入力しました。" : "入力し終えていません。</p>";
}
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
  <p>
    名前: <input type="text" name="name" /><br /> 
    メールアドレス: <input type="text" name="email_address" /><br /> 
    年齢(任意): <input type="text" name="age" />
  </p>
  <p align="center">
    <input type="submit" value="送信" name="submitted" />
  </p>
</form>
(原書errataに従い修正)
p163
下から
7行目
class SupernaturalPerson
class SupernaturalPerson extends Person
(原書errataに従い修正)
p168
一番下の
コード片
trait Logger
{
  public log($logString)
trait Logger
{
  public function log($logString)
(原書errataに従い修正)
p169
上から
9行目
public addUser(User $user)
public function addUser(User $user)
(原書errataに従い修正)
p169
下の
コード片
trait First
{
  public doFirst()
  {
    echo "first\n";
  }
}

trait Second
{
  public doSecond()
  {
    echo "second\n";
  }
}

trait Third
{
  use First, Second;

  public doAll()
  {
    $this->doFirst();
    $this->doSecond();
  }
}
trait First
{
  public function doFirst()
  {
    echo "first\n";
  }
}

trait Second
{
  public function doSecond()
  {
    echo "second\n";
  }
}

trait Third
{
  use First, Second;

  public function doAll()
  {
    $this->doFirst();
    $this->doSecond();
  }
}
(原書errataに従い修正)
p181
下から
3行目〜
p182
1行目
if (!session_is_registered('l')) {
  $logger = new Log("/tmp/persistent_log");
  session_register('l');
  $logger->write("作成時刻 $now");
if (!isset($_SESSION['logger'])) {
  $logger = new Log("/tmp/persistent_log");
  $_SESSION['logger'] = $logger;
  $logger->write("作成時刻 $now");
(原書errataに従い修正)
p192
例7-4
例7-4 GETメソッドを使用した温度変換(temp2.php)
<html>
<head><title>温度の変換</title></head>
<body>

<?php $fahrenheit = $_GET['fahrenheit'];

if (is_null($fahrenheit)) { ?>
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
    華氏の温度を入力します。
    <input type="text" name="fahrenheit" /><br />
    <input type="submit" value="摂氏に変換! " />
  </form>
<?php }
else {
   $celsius = ($fahrenheit - 32) * 5 / 9;
   printf("%.2fF は %.2fC です", $fahrenheit, $celsius);
} ?>

</body>
</html>
例7-4 GETメソッドを使用した温度変換(temp2.php)
<html>
<head>
<title>温度の変換</title>
</head>
<body>
<?php
if (isset ( $_GET ['fahrenheit'] )) {
  $fahrenheit = $_GET ['fahrenheit'];
} else {
  $fahrenheit = null;
}
if (is_null ( $fahrenheit )) {
    ?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET">
    華氏の温度を入力します。 <input type="text" name="fahrenheit" /><br />
    <input type="submit" value="摂氏に変換!" />
  </form>
<?php
} else {
  $celsius = ($fahrenheit - 32) * 5 / 9;
  printf ( "%.2fF は %.2fCです", $fahrenheit, $celsius );
}
?>
</body>
</html>
(原書errataに従い修正)
p196
中央あたり
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
  当てはまる項目を選択してください。<br />
  <?php makeCheckboxes('attributes', $attrs, $personalityAttributes); ?><br />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
  当てはまる項目を選択してください。<br />
  <?php makeCheckboxes('attributes[]', $attrs, $personalityAttributes); ?><br />
(原書errataに従い修正)
p209
例7-13
1〜6行
<html>
<head><title>設定の登録</title></head>
<body>

<?php
session_start();

$colors = array(
<?php session_start() ?>
<html>
<head><title>設定の登録</title></head>
<body>

<?php
$colors = array(
(原書errataに従い修正)
p228
4行目
$comments = fread($file_handle, filesize($filename));
$comments = file_get_contents($filename) ;
(原書errataに従い修正)
p289
3行目
$err = xml_get_error_code();
$error = xml_get_error_code();
(原書errataに従い修正)
p289
一番下の
コード片
$error = xml_get_error_code($parser);
if ($error != XML_ERROR_NONE) {
  die(xml_error_string($err));
}
$error = xml_get_error_code($parser);
if ($error != XML_ERROR_NONE) {
  die(xml_error_string($error));
}
(原書errataに従い修正)
p295
1〜2行目
たとえばBookList.xmlからすべての書籍のタイトルを表示するには、次のようにします。

$document = simplexml_load_file("BookList.xml");
たとえばbooks.xmlからすべての書籍のタイトルを表示するには、次のようにします。

$document = simplexml_load_file("books.xml");
(原書errataに従い修正)
p295
中央の
コード片
$document = simplexml_load_file("BookList.xml");

foreach ($document->children() as $book) {
  $book->title = "新しいタイトル";
}

file_put_contents("BookList.xml", $document->asXml());
$document = simplexml_load_file("books.xml");

foreach ($document->children() as $book) {
  $book->title = "新しいタイトル";
}

file_put_contents("books.xml", $document->asXml());
(原書errataに従い修正)



Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]