書籍概要

本格入門

PHP本格入門[上]
~プログラミングとオブジェクト指向の基礎からデータベース連携まで

著者
発売日
更新日

概要

Webアプリケーションの定番言語であるPHPの基礎から実践までを,上下巻のフルボリュームで集大成。

「この目的を実現するためには,どの文法テクニックが適合しやすいだろう?」
「このプログラムをより読みやすくするために,どんなアプローチができるだろう?」

といったことを思考しつつ,「とりあえずは動く」だけで終わらない,現場に求められる品質を形にするための知識とテクニックを解説します。

こんな方におすすめ

  • プログラミング入門,PHPの超入門レベルの知識はあるが,実践レベルの知識がないプログラマ

著者から一言

PHPは,動的なWebページ(Webアプリケーション)を実現するために使われるプログラム言語です。自由度の高さと習得のしやすさに定評があり,今でも高い人気を維持し続けています。そして,自由度の高さが,ときとして裏目に出ることもあります。

著者は,自身の20年来のプログラマーとしての経歴の中で,大小含めて50を超えるPHPプロジェクトの開発に携わってきました。トラブルプロジェクトの調査役や火消し役としてあとから参加したプロジェクトもありますが,その中のいくつかは,ゼロからの作り直しを余儀なくされたこともありました。その原因は以下のようなものでした。

  • 潜在的に品質が悪く,多くのバグフィックスを入れても安定稼働にいたらなかった
  • 離脱したチームメンバーが書いたプログラムが複雑怪奇で,だれも手を入れることができなくなった

なぜそのようなことになったのかをソースコードから突き詰めていくと,PHPの持つ自由度の高さへの,甘えのようなものが本質にあったのではないかと思います。

PHPは,凝ったプログラム設計をせず,実直にプログラミングしても,とりあえずは動いてくれます。そのような「とりあえずは動く」状態に持っていくだけであれば,それほど多くの習得時間を必要としません。一方で,そのようなPHPの寛容さが,チーム開発になると裏目に出てきます。チームメンバーがひとりよがりな流儀でプログラミングをした結果,それぞれの機能を書いた本人にしか読解できない,複雑怪奇なアプリケーションに仕上がりがちなのです。

このようなPHP開発にありがちな状況をふまえ,著者は

  • よいPHPアプリケーションの「あるべき姿」
  • あるべき姿に近づくための,アプリケーション設計ポリシー

を共通理解としてもつことが,今のPHP習得者にはとりわけ重要であると考えました。そして,本書ではこの考えのもと,以下のような内容も積極的に取り入れることにしました。

  • 目的の理解……その文法要素が使われやすい用途
  • 読みやすさ……コーディング規約/読みやすいプログラミング作法
  • 変更へのしなやかさ……独立性の高いオブジェクト指向設計
  • 品質の見える化……プロファイリング/デバッグ手法
  • 安心感を維持する仕組み作り……自動テスト/リファクタリング手法

本書は,理路整然と文法テクニックが並べられただけの入門書ではありません。

「この目的を実現するためには,どの文法テクニックが適合しやすいだろう?」
「このプログラムをより読みやすくするために,どんなアプローチができるだろう?」

といったことを思考しながら進めていきます。

これらのことは,手練のプロでも日常的に思い悩むことです。なぜなら,1つの目的を実現するためのアプローチが3~4パターンあることは普通で,明確な答えがないことも多いからです。だからこそ,PHP習得の早い段階で,こういった思考のトレーニングを積んでおくことが肝要なのです。そして,その思考の時間は楽しいものです。

本書をとおして,あたかもPHP開発プロジェクトの現場にいるような気分で,思考するプロセスの楽しさを味わっていただければ幸いです。

目次

1章 はじめてのPHP

1-1 Webの仕組みとPHPの役割

  • 1-1-1 Webページを動的に組み立てるためのプログラム言語 ― PHP
  • 1-1-2 ラッキーカラーをPHPで動的に表示する
  • 1-1-3 PHPはサーバー上で実行される,サーバーサイド言語
  • 1-1-4 PHPはしなやかなプログラム言語 ― 他言語との比較
  • 1-1-5 HTMLの基本的な書式を理解する
  • 1-1-6 レイアウトはHTMLで,視覚表現はCSSで

1-2 WebサーバーとWebクライアントはどのようにコミュニケーションをとるのか ― HTTPリクエストとHTTPレスポンス

  • 1-2-1 Webクライアントからのページ要求 ― HTTPリクエスト
  • 1-2-2 Webサーバーからのページ応答 ― HTTPレスポンス

1-3 WebサーバーとPHP

  • 1-3-1 Webサーバーソフトウェアを使ってOSにWebサーバー機能をもたせる
  • 1-3-2 PHPの2つの実行方法 ― CGI版とCLI版

1-4 XAMPPによる開発環境のセットアップ

  • 1-4-1 Windows版XAMPPをインストールする
  • 1-4-2 Apacheを起動する
  • 1-4-3 ダウンロードファイルを展開する
  • 1-4-4 php.iniを設定する
  • 1-4-5 コマンドラインでPHPを実行する ― CLI版PHP

1-5 ベーシックなPHPプログラム

  • 1-5-1 PHPプログラムはPHPタグの中に書く
  • 1-5-2 PHPの命令文はセミコロンで終わらせる
  • 1-5-3 プログラマーのためのヒントを残す ― コメント
  • 1-5-4 URLとファイルパスの関係を理解する ― localhostドメインとドキュメントルート

2章 PHPの基本構文

2-1 変数を使って値を出し入れする ― 代入と出力

  • 2-1-1 流動的なデータを持ち運ぶ ― 変数
  • 2-1-2 変数の命名規則
  • 2-1-3 変数の値を出力する ― echo命令,print命令
  • 2-1-4 デバッグのために変数の情報を出力する ― var_dump命令

2-2 さまざまな形式の値を取り扱う ― データ型

  • 2-2-1 単一のデータを保存する ― スカラー変数とデータ型
  • 2-2-2 文字列データの扱い(1) ― 固定値と変数値をつなぐ
  • 2-2-3 文字列データの扱い(2) ― クオート内でクオートを使う
  • 2-2-4 文字列データの扱い(3) ― エスケープシーケンスで特殊な文字を表す
  • 2-2-5 文字列データの扱い(4) ― 改行コードをPHP_EOLで切り替える
  • 2-2-6 文字列データの扱い(5) ― 長い文字列にはヒアドキュメントを使う
  • 2-2-7 値のデータ型を変換する ― キャスト
  • 2-2-8 複数の値を順序立てて保存する ― 配列
  • 2-2-9 複数の値をラベル付きで保存する ― 連想配列
  • 2-2-10 PHPにとっては配列も連想配列も同じ
  • 2-2-11 配列を多階層にする ― 多次元配列
  • 2-2-12 配列/連想配列の要素数を得る ― count関数
  • 2-2-13 配列の各要素をスカラー変数に割り当てる ― list()
  • 2-2-14 特別な意味を持つ値に名前を付ける ― 定数
  • 2-2-15 PHPにより値が設定される定数 ― マジック定数

2-3 役割を持つ記号たち ― 演算子

  • 2-3-1 四則演算などの計算をする ― 代数演算子,加算子/減算子
  • 2-3-2 配列を合成する2つの方法 ― 加算の演算子(+)とarray_merge関数
  • 2-3-3 浮動小数点数の計算 ― 丸め誤差への対応
  • 2-3-4 丸め誤差が起こる原因は,10進数→2進数の対応づけが正確にできないことにある
  • 2-3-5 すでにある変数値に演算を加える ― 複合演算子
  • 2-3-6 2つの変数で1つの値を共有する ― リファレンス渡し
  • 2-3-7 値を比較する ― 比較演算子
  • 2-3-8 浮動小数点数を比較する
  • 2-3-9 2つの値の等価と大小を同時に比較する ― 宇宙船演算子
  • 2-3-10 比較結果に応じた値を選ぶ ― 条件演算子(三項演算子,null合体演算子)
  • 2-3-11 2つ以上の条件を組み合わせる ― 論理演算子
  • 2-3-12 論理演算子の優先順位をコントロールする
  • 2-3-13 論理演算子と命令文の組み合わせで,シンプルな条件分岐を表す
  • 2-3-14 ビット列で複数の真偽値をまとめて表す ― ビット演算子

2-4 条件によって処理を切り替える ― 条件分岐

  • 2-4-1 シンプルな条件分岐 ― if構文
  • 2-4-2 枝分かれした条件分岐 ― if~elseif構文
  • 2-4-3 条件にマッチしなかった場合の分岐 ― if~else構文
  • 2-4-4 条件式の表現をより豊かにする
  • 2-4-5 条件分岐による空欄チェック処理 ― PHPの自動型変換に気をつける
  • 2-4-6 変数値による条件分岐 ― switch構文
  • 2-4-7 異常時にプログラムを強制終了する ― exit命令,die命令

2-5 同じ処理を繰り返す ― ループ処理

  • 2-5-1 配列/連想配列に対する繰り返し処理 ― foreachループ
  • 2-5-2 それぞれの要素をループ中に書き換える ― リファレンス渡しによるforeach
  • 2-5-3 リファレンス変数のunsetを忘れると何が起こるか
  • 2-5-4 回数を指定した繰り返し処理 ― forループ
  • 2-5-5 forループを配列のループ処理に使う
  • 2-5-6 制御構文はネストできる
  • 2-5-7 ある条件を満たす間の繰り返し処理 ― whileループ
  • 2-5-8 繰り返し処理の制御 ― break命令,continue命令
  • 2-5-9 制御構文の開始と終了をわかりやすく書く ― endif,endforeach,endfor,endwhile

2-6 一連のプログラム処理を意味のある単位でまとめる ― 関数

  • 2-6-1 関数の基本的な書き方 ― 関数名,引数,戻り値
  • 2-6-2 return命令は関数を途中で終わらせる
  • 2-6-3 関数から別の関数をコールする
  • 2-6-4 関数内で引数を書き換えた時の挙動 ― 値渡しとリファレンス渡し
  • 2-6-5 その関数は,汎用的か?
  • 2-6-6 関数の内と外で,見えている変数が違う ― 変数のスコープ
  • 2-6-7 引数と戻り値のデータ型を指定する ― 型宣言
  • 2-6-8 データ型の暗黙的な変換を防ぐ ― declare文とstrict_types
  • 2-6-9 declare命令はプログラムファイル単位でしか適用できない
  • 2-6-10 オプショナルな引数を定義する ― デフォルト引数
  • 2-6-11 引数の数を限定しない ― 可変長引数リスト
  • 2-6-12 値として受け渡しできる関数 ― クロージャー
  • 2-6-13 クロージャー外の変数をuseキーワードで引き継ぐ
  • 2-6-14 クロージャーをcallable型の引数として渡す
  • 2-6-15 2つ~3つ程度の処理バリエーションなら,クロージャーより条件分岐を選ぶ

2-7 共通部品を外部ファイル化し,プログラム間で共有する ― require命令,include命令

  • 2-7-1 require_once命令でPHPプログラムを読み込む
  • 2-7-2 読み込み対象のファイルは絶対パスで指定する
  • 2-7-3 include命令でWebページのパーツHTMLを読み込む
  • 2-7-4 PHPプログラムだけのファイルでは,PHPタグを閉じない

2-8 PHP実行時のオプション設定

  • 2-8-1 オプション設定の方法1 ― php.iniで指定する
  • 2-8-2 オプション設定の方法2 ― .htaccessで指定する
  • 2-8-3 オプション設定の方法3 ― Apacheの設定ファイルhttpd.confで指定する
  • 2-8-4 オプション設定の方法4 ― ini_set関数で指定する
  • 2-8-5 オプションの設定方法と適用される範囲
  • 2-8-6 オプションによって使える指定方法が異なる ― PHP_INI_*モード
  • 2-8-7 よく扱う実行時オプション一覧
  • 2-8-8 エラーレベルを制御するオプション ― error_reportingオプションとE_*定数
  • 2-8-9 開発サーバーと本番サーバーでのエラーレベル設定

3章 プログラムを部品化し,拡張に強いアプリケーションを作る ― オブジェクト指向

3-1 オブジェクト指向 ― アプリケーションの品質をゆらぎにくくする技術

  • 3-1-1 オブジェクト指向がもたらすメリット
  • 3-1-2 処理を役割分担する ― クラス
  • 3-1-3 クラスに状態を持たせる ― プロパティ
  • 3-1-4 クラスにふるまいを持たせる ― メソッド
  • 3-1-5 クラスに命を吹き込む ー インスタンス
  • 3-1-6 どんなものがクラスになりうるか ― ものと概念と呼び名

3-2 PHPを使ったオブジェクト指向の実装

  • 3-2-1 クラスを定義する
  • 3-2-2 プロパティを定義する
  • 3-2-3 メソッドを定義する
  • 3-2-4 インスタンス化する ― newキーワード
  • 3-2-5 インスタンスを別のクラスに渡す
  • 3-2-6 1つの役割が,複数のクラスにまたがらないようにする
  • 3-2-7 インスタンス化された時の初期化処理をおこなう ― コンストラクタ
  • 3-2-8 プロパティとメソッドのアクセス権を指定する ― アクセス修飾子
  • 3-2-9 プロパティはprivateが基本 ― アクセサメソッド
  • 3-2-10 クラス固有の定数を持たせる ― オブジェクト定数
  • 3-2-11 インスタンスの状態に左右されないメソッド ― 静的メソッド
  • 3-2-12 プログラム処理全体でクラスの1つの状態を共有する ― 静的プロパティ
  • 3-2-13 静的メソッド/プロパティは自クラスのインスタンスメソッド/プロパティにアクセスできない

3-3 クラスに親子関係を持たせる ― 抽象クラスと継承

  • 3-3-1 抽象クラスで共通概念を定義し,継承で現実化する
  • 3-3-2 継承に適しているかを判断する ― ●●は▲▲である
  • 3-3-3 抽象クラス/抽象メソッドを定義する ― abstractキーワード
  • 3-3-4 スーパークラスを継承する ― extendsキーワード
  • 3-3-5 スーパークラスの型を使って,サブクラスをひとまとめに扱う
  • 3-3-6 スーパークラスのメソッドを上書きする ― オーバーライド
  • 3-3-7 オーバーロードはPHPでは許可されていない
  • 3-3-8 継承におけるコンストラクタの扱い
  • 3-3-9 スーパークラスのメソッドを呼び出す ― parentキーワード
  • 3-3-10 継承またはオーバーライドをさせない ― finalキーワード

3-4 クラスのメソッド定義を「約束」させる ― インターフェースと実装

  • 3-4-1 インターフェースの文法上の性質
  • 3-4-2 インターフェースは,ルールに従っていることを約束させるために使う
  • 3-4-3 インターフェースを定義する
  • 3-4-4 インターフェースを実装する ― implementsキーワード
  • 3-4-5 インターフェースの型を使って,実装クラスをひとまとめに扱う

3-5 横断的で定形的な処理をクラスに挿し込む ― トレイト

  • 3-5-1 プロパティ名/メソッド名のバッティングを解決する ― insteadofキーワード,asキーワード
  • 3-5-2 トレイトとクラスは密な関係を生む

3-6 名前空間を使って,関連するクラス群をカテゴリー分けする

  • 3-6-1 名前空間を定義する ― namespaceキーワード
  • 3-6-2 名前空間に所属するクラスを呼び出す
  • 3-6-3 名前空間に所属するクラスをあらかじめインポートする ― useキーワード
  • 3-6-4 同じ名前のクラスにエイリアスを与えてインポートする ― asキーワード
  • 3-6-5 2つ以上のクラスをまとめてインポートする

3-7 イレギュラーなケースに対処する ― 例外処理

  • 3-7-1 Exceptionクラスのプロパティ/メソッド
  • 3-7-2 例外をスローする ― throw命令
  • 3-7-3 例外をキャッチする ― try~catch~finallyブロック
  • 3-7-4 呼び出し元のさらに呼び出し元に例外が伝わる ― 例外の伝播
  • 3-7-5 Exceptionクラスを継承して独自の例外クラスを作る
  • 3-7-6 例外の種類に応じた処理をする ― catchブロックをつなげる
  • 3-7-7 PHPの標準クラスも例外をスローする
  • 3-7-8 PHPにあらかじめ用意された例外クラス ― LogicExceptionとRuntimeException

3-8 クラスの操作に自動で反応するメソッド ― マジックメソッド

  • 3-8-1 アクセス不能プロパティが読み書きされた時にコールされる__get(),__set()
  • 3-8-2 インスタンスが出力された時に文字列表現を返すための__toString()

3-9 インスタンスとの付き合い方 ― オブジェクト型変数の性質

  • 3-9-1 オブジェクト型の変数はリファレンスである
  • 3-9-2 インスタンスをコピーする ― cloneキーワード
  • 3-9-3 オブジェクト型のプロパティをディープコピーする ― マジックメソッド__clone
  • 3-9-4 インスタンス同士を比較する
  • 3-9-5 インスタンスの型をチェックする ― instanceofキーワード

4章 アプリケーションの機能をより豊かにする ― 内部関数/SPLクラス

4-1 関数とクラスの種類 ― プログラマーが定義したもの/あらかじめ用意されているもの

  • 4-1-1 汎用的な処理が定義された関数群 ― 内部関数
  • 4-1-2 汎用的な処理が定義されたクラス群 ― 定義済クラスとSPL
  • 4-1-3 関数の構文を理解する

4-2 文字列を扱う ― 文字列処理のための関数

  • 4-2-1 内部文字エンコーディングを取得または設定する ― mb_internal_encoding
  • 4-2-2 文字を検索する ― mb_strpos,mb_strrpos
  • 4-2-3 文字列の一部を得る ― mb_substr,mb_strstr
  • 4-2-4 文字列を置換する ― str_replace
  • 4-2-5 文字列を区切り文字で分割する ― explode
  • 4-2-6 文字列をパディングする ― str_pad
  • 4-2-7 字種を変換する ― mb_convert_case,mb_convert_kana
  • 4-2-8 文字コードを変換する ― mb_convert_encoding,mb_convert_variables
  • 4-2-9 指定した幅で文字列を丸める ― mb_strimwidth
  • 4-2-10 文字列の前後にあるスペースなどを取り除く ― trim
  • 4-2-11 バイナリデータを文字列に変換する ― base64_encode,base64_decode
  • 4-2-12 URLで使える文字列に変換する ― urlencode,urldecode
  • 4-2-13 URLを要素に分け,クエリ文字列を解析/生成する ― parse_url,parse_str,http_build_query

4-3 正規表現を使ったパターンマッチング

  • 4-3-1 正規表現で文字列を検索する ― preg_match
  • 4-3-2 正規表現で文字列を置換する ― preg_replace
  • 4-3-3 正規表現による文字列の分割 ― preg_split
  • 4-3-4 正規表現のエスケープ ― preg_quote

4-4 数値を扱う ― 数値処理のための関数

  • 4-4-1 最小値/最大値を得る ― min,max
  • 4-4-2 四捨五入,切り上げ,切り捨てする ― round,ceil,floor
  • 4-4-3 数値をフォーマットする ― number_format
  • 4-4-4 浮動小数点数を正確に計算する ― BCMath
  • 4-4-5 基数を相互に変換する ― base_convert
  • 4-4-6 バイナリデータを可視化する ― bin2hex,hex2bin

4-5 日付/時間を操作する ― DateTimeクラス

  • 4-5-1 DateTimeクラスの基本的な使い方 ― setDate,setTime,modify,setTimezone,format
  • 4-5-2 日付をフォーマットする ― DateTime::format
  • 4-5-3 日付を比較する ― DateTimeインスタンスと比較演算子
  • 4-5-4 期間に重なりがあるかを判定する
  • 4-5-5 ちょっとした日時操作のための手軽に使える内部関数 ― time,strtotime,date

4-6 配列/連想配列を操作する

  • 4-6-1 配列の要素を追加/削除する ― array_push,array_(un)shift,array_merge,array_pop,array_slice,unset
  • 4-6-2 連想配列のキーのみ,値のみを取得する ― array_keys,array_values
  • 4-6-3 全要素を対象に処理をほどこす ― array_map,array_walk
  • 4-6-4 連想配列の配列から指定したキーを持つ値のみ抽出する ― array_column
  • 4-6-5 区切り文字列で配列を文字列化する ― implode
  • 4-6-6 配列をソートする ― sort,rsort,ksort,krsort
  • 4-6-7 配列をユーザ定義のルールでソートする ― usort
  • 4-6-8 配列の要素数を調べる ― count
  • 4-6-9 範囲指定で配列を作成する ― range

4-7 ファイル/ディレクトリを扱う

  • 4-7-1 パス文字列からファイル名,ディレクトリ名を取得する ― basename,dirname,realpath,pathinfo
  • 4-7-2 ファイルの存在を確認する ― file_exists
  • 4-7-3 ファイルをコピー/移動/削除する ― copy,rename,unlink
  • 4-7-4 ファイルから読み込む ― file,file_get_contents,readfile
  • 4-7-5 ファイルに書き込む ― file_put_contents
  • 4-7-6 ファイルにアクセスする ― touch,file(c|m|a)time
  • 4-7-7 ファイル種別MIMEタイプを調べる ― finfo_file
  • 4-7-8 ディレクトリ操作する ― mkdir,rmdir
  • 4-7-9 ファイルをパターンで検索する ― glob

4-8 ファイル操作をクラスでおこなう ― SplFileObjectクラス,DirectoryIteratorクラス

  • 4-8-1 ファイルを読み書き用にオープンする ― SplFileObject::__construct,setFlags
  • 4-8-2 CSVファイルを読み込む ― SplFileObject::READ_CSV定数
  • 4-8-3 ファイルに書き出す ― SplFileObject::fwrite,fputcsv
  • 4-8-4 ファイルのメタ情報を取得する
  • 4-8-5 ディレクトリを調べる ― DirectoryIterator

4-9 データの妥当性をチェックする

  • 4-9-1 データ型をチェックする ― is_*
  • 4-9-2 日付をチェックする ― checkdate
  • 4-9-3 空であることをチェックする ― empty
  • 4-9-4 変数や配列キーの存在をチェックする ― isset,array_key_exists
  • 4-9-5 配列に値が存在するかをチェックする ― in_array
  • 4-9-6 あるクラスのインスタンスかどうかをチェックする ― instanceofキーワード
  • 4-9-7 クラス,関数,メソッドの存在をチェックする ― class_exists,function_exists,method_exists,is_callable

4-10 ランダムな値を生成する ― 乱数

  • 4-10-1 ランダムな数値を生成する ― random_int
  • 4-10-2 ランダムなバイト列を生成する ― random_bytes,openssl_random_pseudo_bytes

4-11 データを安全に取り扱う ― ハッシュ化と暗号化

  • 4-11-1 ハッシュ化の仕組み ― ソルト,ストレッチング
  • 4-11-2 暗号化の仕組み ― キーを使って金庫を開け閉めする
  • 4-11-3 パスワードをハッシュ化する ― password_hash,password_verify
  • 4-11-4 ファイルのハッシュ値をもとに,誤りチェックする ― hash_file
  • 4-11-5 データを暗号化/復号する ― openssl_*関数

4-12 コマンドラインプログラムの実行時オプションを制御する ― コマンドライン引数

  • 4-12-1 コマンドライン引数を取得する ― getopt
  • 4-12-2 コマンドラインプログラムの挙動を実行時オプションによって変える

4-13 メールを送信する

  • 4-13-1 スパムメール対策のために,メール送信を外部Webサービスに任せる選択肢もある
  • 4-13-2 メールを送信する ― mb_send_mail

4-14 OSコマンドをPHPから実行する

  • 4-14-1 汎用的な処理のほとんどは,PHPプログラムでも書ける
  • 4-14-2 OSに依存する処理を条件分岐する
  • 4-14-3 OSコマンドを呼び出す ― system,exec,shell_exec
  • 4-14-4 OSコマンドの引数をエスケープする ― escapeshellarg

4-15 デバッグに役立つ情報を得る

  • 4-15-1 バックトレース情報を取得する ― debug_backtrace
  • 4-15-2 メモリ情報を取得する
    ― memory_get_usage,memory_get_peak_usage

5章 PHPによるWebアプリケーションの実装

5-1 入力フォームを介したデータ送受信

  • 5-1-1 送信したい入力フォームをHTMLで定義する
  • 5-1-2 入力フォームの入力値をPHPで受信する ― スーパーグローバル変数$_GET,$_POST
  • 5-1-3 $_GETと$_POSTの両方を兼ねる$_REQUESTと,request_orderオプション
  • 5-1-4 HTMLとして意味のある記号をHTMLエンティティに変換する ― htmlspecialchars関数
  • 5-1-5 GETメソッドはデータを取得する時に使う
  • 5-1-6 POSTメソッドはデータを投稿する時に使う
  • 5-1-7 アンカータグ中のGETパラメータ値はURLエンコードする

5-2 リクエストヘッダ/レスポンスヘッダ情報の読み書き

  • 5-2-1 HTTPレスポンスの構造 ― ヘッダとボディ
  • 5-2-2 HTTPステータスコードをPHPから送出する
  • 5-2-3 別のURLにリダイレクトさせる ― Locationヘッダ
  • 5-2-4 メディア形式を指定して出力する ― Content-Typeヘッダ
  • 5-2-5 サーバー情報を取得する ― $_SERVER変数

5-3 クッキーを使ってクライアントPCに情報を保存する

  • 5-3-1 さまざまなデータの保存方式 ― クッキー,セッション,データベース
  • 5-3-2 Set-Cookieヘッダの属性を知る
  • 5-3-3 PHPからクッキーを送出する ― setcookie関数
  • 5-3-4 保存されたクッキーをGoogle Chromeで確認する
  • 5-3-5 保存されたクッキーをFirefoxで確認する
  • 5-3-6 配列形式でクッキーを出力する
  • 5-3-7 クッキーを上書きする
  • 5-3-8 クッキーを削除する
  • 5-3-9 Webブラウザが送信したクッキーデータをPHPで読み取る ― $_COOKIE変数
  • 5-3-10 クッキーを使って「最近アクセスしたページ」を実装する
  • 5-3-11 自動ログイン機能をクッキーで実現する

5-4 セッション変数を使ってサーバー上に情報を保存する

  • 5-4-1 セッション変数の仕組みと使いみち
  • 5-4-2 セッション管理のための関数たち ― session_*関数
  • 5-4-3 セッションに関するphp.iniの実行時オプション
  • 5-4-4 セッションがタイムアウトするまでの時間を設定する ― session.gc_*オプション
  • 5-4-5 お問い合わせ画面のプログラムを読解する

5-5 ファイルアップロード処理

  • 5-5-1 アップロードフォームを定義する
  • 5-5-2 アップロードファイルを受信する ― スーパーグローバル変数$_FILES

6章 リレーショナルデータベースを使った体系的なデータ管理

6-1 体系的なデータ管理を実現するソフトウェア ― リレーショナルデータベース

  • 6-1-1 データを管理する単位 ― テーブル,レコード,カラム
  • 6-1-2 データを扱うための言語 ― SQL

6-2 SQLでデータベースを操作する

  • 6-2-1 phpMyAdminを使ってMariaDBを操作する
  • 6-2-2 テストデータをデータベースに投入する
  • 6-2-3 データベースを作成する ― CREATE DATABASE構文
  • 6-2-4 テーブルを作成する ― CREATE TABLE構文
  • 6-2-5 厳密モード(STRICT_ALL_TABLES)で,文字数オーバー時にエラーを発生させる
  • 6-2-6 バイナリデータを保存するBLOB型
  • 6-2-7 カラムごとにオプションを指定する
  • 6-2-8 レコードを検索する ― SELECT構文
  • 6-2-9 レコードを集計する ― 集約関数
  • 6-2-10 ページネーションのためのSELECT構文テクニック ― ORDER BY,LIMIT,OFFSET句
  • 6-2-11 レコードを更新する ― UPDATE構文
  • 6-2-12 レコードを新規作成する ― INSERT構文
  • 6-2-13 レコードを削除する ― DELETE構文
  • 6-2-14 照合順序で大文字/小文字の区別を指定する

6-3 PHPプログラムからデータベース操作する ― PDOの利用

  • 6-3-1 PDOでデータベースに接続する
  • 6-3-2 PDOの動作オプションを指定する ― PDO::setAttributeメソッド
  • 6-3-3 現在の動作オプション値を得る ― PDO::getAttributeメソッド
  • 6-3-4 更新系SQLを実行する
  • 6-3-5 SELECT文を実行し,結果をフェッチする ― PDOStatement::fetchメソッド
  • 6-3-6 PDO::FETCH_OBJによるフェッチ
  • 6-3-7 プリコンパイルすることで,SQL実行時のセキュリティリスクを減らす
  • 6-3-8 2種類のバインド方式 ― bindValueとbindParam
  • 6-3-9 一連のSQL実行中に起こる例外に対応する ― トランザクション管理
  • 6-3-10 自動コミットモードを指定する ― PDO::ATTR_AUTOCOMMIT
  • 6-3-11 実行されたSQLのログを見る
  • 6-3-12 IN句のプレースホルダに配列を渡せない問題に対処する

7章 読みやすいPHPプログラミング作法 ― 開発者の意図を,わかりやすく伝える

7-1 コーディング規約 ― 見た目に美しく読みやすいコード作り

  • 7-1-1 最低限のコーディング規約は考えておいたほうがいい
  • 7-1-2 PSRとは ― フレームワークフリーの標準的なコーディング規約
  • 7-1-3 PSR-1 基本コーディング規約
  • 7-1-4 PSR-12 拡張コーディングスタイルガイド
  • 7-1-5 PSR-12におけるプログラム冒頭のコーディングスタイル
  • 7-1-6 PSR-12におけるクラスのコーディングスタイル
  • 7-1-7 PSR-12における制御構文のコーディングスタイル
  • 7-1-8 PSR-12におけるクロージャーのコーディングスタイル
  • 7-1-9 HTML&PHPの混在コードを美しく記述する(ifの書き方,ビューヘルパーの使用,phpタグのインデント)
  • 7-1-10 コーディングスタイルの変更リスク ― スタイルはなるべく早く決めておく

7-2 読み手に意図が伝わるコーディング ― 迷いを与えない

  • 7-2-1 「伝わりにくい」プログラムの例
  • 7-2-2 「伝わりやすい」プログラムの例
  • 7-2-3 コメント文で意図を補足する
  • 7-2-4 伝わりやすく,情報に過不足がない命名を考える
  • 7-2-5 将来も見すえた命名を考える
  • 7-2-6 命名を省略しすぎない
  • 7-2-7 命名を冗長にしすぎない
  • 7-2-8 配列データは複数形で命名する
  • 7-2-9 ローマ字や母国語の命名は避けたほうがいい
  • 7-2-10 伝わりやすいディレクトリ構成を考える
  • 7-2-11 型宣言で利用者の不安をとりのぞく
  • 7-2-12 否定の否定は肯定 ― はじめから肯定形をつかう

7-3 見た目をスリムにし,シンプルな思考をうながす

  • 7-3-1 関数を使って条件式をコンパクトにする
  • 7-3-2 先にふるいにかけて,ネストを減らす
  • 7-3-3 関数の戻り値は,確定した時点でreturnする
  • 7-3-4 制御構文のネストをすっきり見せる
  • 7-3-5 たくさんある引数はまとめる
  • 7-3-6 長いテキストは別ファイルにする

サポート

ダウンロード

(2021年7月5日更新)

本書(『PHP本格入門[上]~プログラミングとオブジェクト指向の基礎からデータベース連携まで』および『PHP本格入門[下]~オブジェクト指向設計、セキュリティ、現場で使える実践ノウハウまで』)内で解説したサンプルコードをダウンロードして利用することができます。ダウンロード後,解凍してご利用ください。

第2章のプログラムの一部に誤りが発見されましたので,サンプルファイルの修正および正誤表の更新を行いました。2021年7月5日以前に下記のファイルをダウンロードされた方は,再度ダウンロードしていただきますよう,お願いいたします。

ダウンロード
sample-src.zip

補足情報

配列の定義箇所末尾のカンマについて

(2021年7月5日更新)

P.79「data/array2.php」のように,配列の最終要素の末尾にカンマ記号(,)がついている箇所がいくつかあります。


$user = [
    'name' => '山下次郎',
    'age' => 30,
    'place' => '有田',
];

このような記述は文法的には問題がなく,末尾のカンマ有無によってPHPプログラムの挙動が変わったり,エラーとなることはありません。
PHPマニュアルのページの以下のページ:
https://www.php.net/manual/ja/function.array.php
にも,「一般的ではありませんが,最後に定義された配列エントリの後に続くカンマがある場合,これは有効な構文です。」と記載があります。

末尾のカンマ有り・無しが本書中に混在していることにより困惑を招く可能性があるため,以後の増版時に「カンマ無し」に統一をする予定です。

第2刷からの変更点について

(2021年4月16日更新)

6-3-5項内で参照するプログラムについて,エスケープ処理を施していなかったため,意図しない結果を出力する場合がございました。そのため,より正確なものになるようコードの一部を変更し,関連する本文の内容も合わせて更新いたしました。
該当ページの修正版PDFをアップいたしますので,ご確認ください。

修正版PDF
P.587
P.608~610

正誤表

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

(2022年1月5日最終更新)

P.463 option/ExpiredCustomersDeleteBatch.php プログラム内


private function parseCustomerIds(): void

private function parseCustomerIds(): ?array

(以下2021年7月5日更新)

第2刷訂正情報

P.92 「リスト operator/arrays.php」

<p>●連想配列の合成結果:<p>
<p>●連想配列の合成結果:</p>

P.145 「リスト function/return1.php」if構文条件式 $b<=0 内のecho命令

echo '引数aは正の数で指定してください。';
echo '引数bは正の数で指定してください。'; 

P.145 「リスト function/return1.php」

$total = add(5, -5);
$total = add(-5, 5); 

(以下2020年1月16日更新)

第2刷訂正情報

P.342 「構文 preg_match関数」の「引数 &$matches」の説明

検索検索を代入するための配列
検索結果を代入するための配列

(以下2021年4月16日更新)

第1刷訂正情報(第2刷では修正済み)

P.80 3行目

関連するが属性の異なる値を管理するのに長けてる
関連するが属性の異なる値を管理するのに長けて

P.120 下から3行目

この2つは完全に対をなす関数で、
この2つは対をなす関数で、

「完全に」が不要でした。

P.506 本文および下図内

Content-Type: image/png; charset=UTF-8
Content-Type: image/png

「 charset=UTF-8」が不要でした。

商品一覧