パーフェクトPHP
情報
以下3氏の共著
2010年発売
本書で扱っているPHPのバージョンは5.3
Part 1 PHP ~overview
1章 PHP概要
手作業で環境構築することに触れておきたいと思ったため
各ソフトウェアのバージョンを当時の古いものに合わせなくちゃいけないせいで色々面倒で折れそう…
あんまり触ってないDockerで勉強がてらやった方がよかったかも
CentOS 6.5にしたらPHP、Apache、MySQLの全部をちょうど本と同じバージョンに揃えることができた!よかった…。 モジュールはWebサーバーと同じプロセスでPHPを実行
CGIはWebサーバーと別のプロセスで動作
リクエストの度にプログラムが破棄されるため一般的にモジュールより低速
PHPプログラムが実行される度、内部的にソースコードのコンパイルを行う
Part 2 PHPの言語仕様
2章 PHPの基本
2.1 基本的な構文
PHPのみ記述されたファイルに終了タグは記述しないことを推奨
PHPブロック以外は文字列として出力され、ブロック外の改行などが意図せず出力されることがあるため
isset()は関数のようだが実際は言語構造の1つ
2.2 変数
下の例の$$var_nameはまず$var_nameが評価されるので 1 になる
code:php
$var = 1
$var_name = 'var';
echo $$var_name;
可変変数という
PHPにはブロックスコープがない
tnagatomi.icon ぎょぎょぎょ!
2.4 エラー
エラーの種類
E_STRICT
tnagatomi.icon E_ALLに含まれないと書いてあるが5.4からは含まれている
3章 型と演算子
3.1 型
整数
PHPは符号無し整数をサポートしていない
最大値を超えた整数は自動的にfloatへキャストされる
浮動小数点数
float は実際には double
文字列
tnagatomi.icon ${name}って書いてるけどPHPマニュアルを読む限り{$name}って書いたほうがよさそう
echo などで出力を行う場合、文字列以外の変数・定数などはすべて文字列にキャストされる
echo 15.0は "15" と出力される
論理型
null、0、空であるものが false な他、文字列の "0" も false となる
null
nullの代入された変数は Notice (Undefined variable) が発生しない
文字列から数値型への目一時的なキャストの際、先頭から数値を表す文字が続く範囲を数値として扱い変換する
$password1 == $password2 で $password1 が "123"、$password2 が "0123" だった場合 true となる
3.2 演算子
tnagatomi.icon 論理演算子に and と or も使えるのか。何でもあり感がすごい。
tnagatomi.icon == 演算子についての 表 3.7 型の比較表見てると頭痛くなる
?: 演算子によってsome_func() ? some_func() : 'default';をsome_func() ?: 'default';と書くことができる
PHPの三項演算子は左結合
tnagatomi.icon 三項演算子、個人的には読むの苦手なので使いたくない
tnagatomi.icon エラー制御演算子 @ なんてものがあるのか…
実行演算子 \`\`
shell_exec関数と等価
3.3 配列
PHPの配列はすべて連想配列
添字配列は連続した整数をキーとしている
順序が保証されている
$fruits[] = 'apple'で要素を追加できる
tnagatomi.icon この記法慣れない
キーを持たない要素とキーを持つ要素を混ぜられる
+ 演算と array_merge には違いがある
4章 制御構造と関数
4.1 制御構造
foreach (反復可能なデータ構造 as &要素)で要素の参照を受け取ることができる
ブロック内で要素に対して行われた変更は元の配列の要素に反映される
PHPにはブロックスコープがないことに注意
switch
tnagatomi.icon 本には書いてないけどswitch/caseで行われるのは緩やかな比較らしい
require/require_once
これらは読み込む対象のファイルが存在しない場合、Fatal Errorとなる
読み込んだファイルで処理や出力が行われている場合、読み込んだ時点で出力される
include/include_once
ファイルが存在しなかった場合、Warningとなる
goto
tnagatomi.icon PHP 5.3にもなって追加されたのかw
4.2 関数
tnagatomi.icon リファレンスを返す関数
/icons/わからん.icon
call_user_func_array() 関数では、引数のリストを第二引数に配列として与えることができるため、呼び出す関数の実装を知らずに用いることができる
tnagatomi.icon どういうことだ?配列として渡す場合と1つずつ渡す場合でどう違うんだろ
isset()、unset()、empty()、list() などは関数のようで実際は言語構造である
tnagatomi.icon 明記されてない気がするけどself::はstaticなものにアクセスする時に使う、でいいのだよな?
tnagatomi.icon コンストラクタに定義を記述しなければなにも呼び出されないと書いてあるけどサブクラスだった場合は親クラスのものがprivateじゃない場合は継承するっぽい
tnagatomi.icon 親クラスのコンストラクタは明示的に呼び出す必要がある
stdClass
プロパティやメソッドを一切持たない
他の型からオブジェクト型へキャストを行うとこのクラスのインスタンスとなる
5章 クラスとオブジェクト
5.1 クラス
cloneキーワードでオブジェクトを複製
オブジェクトはunset()で解放できる
PHPでは宣言していないプロパティへの読み書きが可能
存在しないプロパティへの書き込みを行うとpublicなプロパティが作成される
tnagatomi.icon /icons/ひええ〜.icon
5.2 インターフェイス
tnagatomi.icon タイプヒンティングはPHP 7では型宣言と変更され、一致しない場合は例外を投げるようになっている
5.3 クラスとオブジェクトの機能と特徴
マジックメソッド
一切実装しなかった場合は何も起きない
オーバーロード
特定の処理がクラスまたはオブジェクトに施されたときのデフォルトの挙動を上書きする機能
tnagatomi.icon Javaでいうオーバーロード(引数違いの別メソッド)とは違うのか tnagatomi.icon 使いようによっちゃ便利だけど独自実装がかなり入りそうで取扱い注意って機能な感じがする
遅延静的束縛
継承されたクラスのメソッドなどを親クラスで解決するための機能
オートロード
tnagatomi.icon 自前でやる場合はspl_autoload_register()を使うっぽい
5.4 名前空間
tnagatomi.icon PHPには5.3.0まで名前空間なかったのか。言語の進化の歴史を感じられていい。
5.5 例外
PHP 5になるまで例外機能がなかった
5.6 参照
tnagatomi.icon PHPには弱い参照ってあるんだろうか
Part 3 実践Webアプリケーション
6章 Webアプリケーション入門
6.2 ひとこと掲示板作成
tnagatomi.icon PDOを使っておらずあまりいい書き方じゃないのでざっと流し読みして写経はしない 7章 フレームワークによる効率的な開発
7.2 フレームワーク作成
ClassLoaderクラス
tnagatomi.icon オートロードの仕組みがよく解らなかったのでマニュアルで補った
.htaccess
tnagatomi.icon このへんのmod_rewriteの書き方とかは全部網羅するのは難しいので使いながら覚えていく方がいいだろうなぁ
8章 ミニブログアプリケーション開発
8.1 設計とセットアップ
ミニブログ
Twitterのようなアプリケーション
Part 4 PHPセキュリティ
Part 5 テクニカルなPHPの活用
tnagatomi.icon ここもこれまで学んだことの深掘りという感じなのでざっと読んだ
Part 6 PHPレシピ
13章 標準機能
13.3 配列
1つだけ要素を追加するなら array_push() より$array[] = 値の方が関数呼び出しが無い分高速
tnagatomi.icon 関数の多さからもPHPは配列で成り立っているということがよく分かる
全体の感想
PHP
型も厳格じゃなくてエラーが発生しようが動作が続行されて、「とりあえず動かす」というPHPの特性が見えたような気がする
これはメリットでもありデメリットでもあると思うけど
同じようなことを行う関数が多く、動作に微妙に差異があるため覚えるのが大変
配列のキーがセットされているか調べるために array_key_exists を使うか isset を使うかなど
フレームワーク作成
フレームワークというと、使うだけの場合、ルーティングやらセッション管理やら、魔法のようにやってくれるような気がするけど、自分で作ってみると泥臭いことを1つ1つやってるんだなということが知れて良かった