『PHP本格入門』を読む

これはなに

よむやつ。よむのはこれ

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

ch 02. PHPの基本構文

2-2. データ型

  • 配列、連想配列
    • あそういうことか。いままで適当に書いてたけどだいぶ見通し良くなったぞ
  • 定数
    • define()でやる。
    • システム定数てのがあって、これはデバッグとかログとかに使えそう

2-3. 演算子

  • 宇宙船演算子
    • <⇒>
      • なんか勝手に変換されるな、、
      • 右の方が小さいと1, 右の方が大きいと-1
      • usort関数という配列の並び替えするやつと相性良いらしい
  • 三項演算子
    • a ? b : c
  • null合体演算子
    • a ? b
    • そう言う名前なんだ
  • ビット演算子
    • ビット反転させたらする演算子
    • 存在だけ知っとく

2-4. 条件分岐

  • 空欄チェック
    • !$var
    • $var == ‘’
    • empty()
    • isset(), is_null()
    • ===
    • これら全て表現できる空欄チェックが異なるので使い分ける
  • 強制終了
    • exit, die
    • die()はなんか表示して終わらすらしい。
      • これどの文脈なんだろ、webだとtry catchになると思うけど

2-5. ループ処理

  • ループと参照渡し
    • foreach($list as &$el) {…てやると、$elの値を変更すると$listも変わる
      • ループ抜けた後にunset($el)しないと参照が残る
      • array_walk()使うのも良い
    • 面白いな、けどこれ多分使われないな
  • :を使った表現
    • if:
    • else:
    • endif
      • pythonと同じだ

2-6. 関数

  • 関数の引数
    • 引数も参照渡しできる
    • function add(&$var)
  • 型宣言
    • declare(strict_type=1);すると、引数に適当な値渡した時にちゃんとチェックしてくれる。
    • これはプログラムファイル単位にしか適用できない
  • 可変長引数リスト
    • arrayで型宣言して引数にすると、任意の型のリストになる
    • …stringとすると、strのリストになる
    • 可変長引数は引数の最後でしか使えない
    • コールする側で…とすることも可能
      • その場合、関数定義側でstr1, str2, str3とかって複数の引数を定義してないといけない。

2-7. 外部ファイル読み込み

  • 外部ファイル読み込み
    • require_onceとincludeがよいらしい
    • dirname(/_/_FILE/_/_)でファイルの位置を取ると良い

2-8. 実行時オプション

  • PHP実行時のオプション設定
    • php.iniで定義する
      • これはどこにあるんだろうなあ、どのサーバーアプリケーションでも同じなのかな
      • phpinfo()で確認できる
    • .htaccessで指定する
      • おいたディレクトリ配下に適用される
    • httpd.confで指定する
      • Apacheの設定ファイル。.htaccessと同じ書き方ができる。
    • ini_set関数で指定する
      • php.iniを上書きできる
      • 処理中は設定が継続する
    • それぞれ適用範囲が異なる
    • オプションによってモードが指定されていて、そのモードによってどの設定方法が可能かが変わる
  • error_reportingオプション
    • どのレベルのエラーメッセージを表示するかを決める
    • どこに表示するの???
      • 画面っぽい

疑問

  • エラーレベルの指定できるけど、ログに出力するやり方どうなってるんだろ

ch 3. オブジェクト指向

3-1. オブジェクト指向とは

  • 簡単な説明

3-2. PHPでのオブジェクト指向

  • オブジェクト定数
    • constで定義する
      • private const VAR = xxx;
    • クラス名:: 定数名でアクセスできる
    • クラス内からはself:: 定数名
  • 静的プロパティ
    • staticで定義する
      • private static $var;
  • 静的メソッド/プロパティはインスタンスメソッド/プロパティにアクセスできない
    • インスタンスが静的なやつにアクセスできないのは、いや別に意外ではないか? いや意外だな
    • ここについては解説なし。

3-3. 抽象クラスと継承

3-4. インタフェースと実装

3-5. トレイト

3-6. 名前空間

  • namespaceで定義してuseで使う。
    • 結局requireとかは必要っぽい。useがうれしいのは、クラスをnewするときにnamespace全部書かなくて済むこと。

3-7. 例外処理

  • throw new ExceptionClass(var)
    • 例外クラスのインスタンスを投げる。
    • キャッチされない例外が発生すると、そこで処理は中断される
  • try, catch, finally
    • 例外が起きそうなやつをtryして、
    • catch (任意のEuceptionクラスと、そのインスタンス名){インスタンスを使った処理}
    • finallyでどのみちやる処理書く
      • たぶん、キャッチする例外のクラスは指定できる?
  • 例外の伝播
    • 例外はキャッチされなければ呼び出し元に伝播し、キャッチされるまで飛んでいく
      • キャッチしたのを改めてなげることも可能
    • getTrace()でスタックトレース表示できる
  • 例外の継承
    • オリジナルの例外を出すことも可能。
    • Exceptionを継承する
  • 感想
    • これどういうときに例外を出して、どう処理させるのが良いんだろう。
      • たとえばレコードが取得できない、とかならnullチェックして処理すれば良い

3-8. マジックメソッド

  • __で始まるマジックメソッド
    • __toStringはインスタンスが表示されたときによばれる

3-9. インスタンスの扱い

  • インスタンスは変数にいれると参照渡しになる
    • 複数の変数にいれると、全部で共有することになる
      • だから毎回生成して渡せって言われるのか、、
      • cloneキーワードでもよい
  • インスタンスが他のインスタンスをプロパティとして持つ場合
    • プロパティのやつは、cloneしてもクローンされない
      • しゃろーこぴー
    • __clone()を定義して、子インスタンスもcloneするようにすればよい
      • ディープコピー
  • インスタンスの比較
    • entity的に、別の参照先を持つ場合は値が同じでも別物として処理される
  • インスタンスの型チェックはinstanceofキーワードでやれる
    • $task instanceof Taskみたいに条件文に使える

ch 4. 内部関数、SPLクラス

  • いわゆる標準ライブラリ

4-2. 文字列処理の関数

  • mb_internal_encoding
    • 内部文字エンコーディングを設定、取得する
    • php.iniのmbstring.internal_encodingを取得している。
      • この値はmb_*関数で使われる値。
  • mb_strpos, mb_strrpos
    • 指定文字列がでてくる場所を返す
    • 最初に出てくる場所, 最後に出てくる場所
  • mb_substr, mb_strstr
    • 文字列の一部を取る
    • 指定した場所 or 文字列から切り取る
  • 感想
    • これ全部読むのたるいな
    • 便利そうなのだけしぼるか
  • 便利そうなの
    • urlencode
    • parse_url

4-11. ハッシュ化と暗号化

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

  • バックトレース情報
  • メモリ情報

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

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

  • スーパーグローバル変数での入力受け取り
    • HTMLのformタグから送られたデータの受け取り
    • $_GET, $_POSTで可能
      • 配列にnameがkeyで入ってる
    • $_REQUESTでどっちもいける
  • アンカータグ内のGETパラメータはURLエンコード必須

5-2. request/response header情報の読み書き

  • 返却したいデータに合わせて、headerのコンテンツタイプを切り替える
    • まあ、知っとるな…
  • あとはrawPHPでどう書くのか? って感じ

5-3. クッキーの利用

  • set-cookieヘッダーでname=valueで送信する

5-4. セッション

  • これどうクッキーと違うのか分からんかったかも。保存期間ちがうのは分かる。けど基本はクッキーとおなじよな???

7-1. コーディング規約

  • PSRちゅうのがあるで

感想

  • とりあえずぜんぶさらっと目を通した
    • 例外処理とかは良かったな
    • セッションは分からん
    • なんかまあでも、そういうのあるんだーみたいなの押さえられたし、知らん書き方もしれた気はする。
  • OK