PHPのスコープ
以下はDBに接続してデータを表示するときの例外処理ですが$pdo
をスコープの外から呼び出せることに気づかず頭が混乱しました。JAVA や JavaScript では無理だったような気がする。PHP は問題なく呼び出せるので query を使った関数の引数として使えました。こういう細かい違いが言語仕様っていうやつなのかな。PHP のスコープは JavaScript とは少し違うみたいだから時間を作って調べてみたい。
try { $pdo = new PDO( DSN, DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ] ); } catch (PDOException $e) { echo $e->getMessage(); exit; }
今日覚えたこと
->
は「アロー演算子」。インスタンスのプロパティやメソッドにアクセスできる=>
は「ダブルアロー演算子」。配列に値を代入するための演算子。逆に配列から値を取り出したいときは$配列名('キー');
::
は「スコープ定義演算子」。クラスのプロパティやメソッドにアクセスできる。クラス名::呼び出したいクラスのプロパティまたはメソッド名
として使う
->
は JavaScript の.
と同じだと思う。インスタンスとクラスでアクセス方法がわけられてるところは PHP 独自のものなのかな。
よくわかってないところ
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
これ。=>
が値を代入するための演算子だとすると ATTR_ERRMODE 関数に ERRMODE_EXCEPTION を代入してる?なんのために?
PHP 8.0.0 以降では、これがデフォルトのモードです。 エラーコードを設定することに加え、PDO は PDOException をスローします。エラーコードや 関連情報が、クラスのプロパティとして設定されます。 この設定もまたデバッグ時に有用で、エラーが発生した時点で スクリプトの実行を停止させることによりコード内の問題点を 見つけやすくなります (例外によりスクリプトが終了した際には、トランザクションは自動的に ロールバックされることを覚えておきましょう)。
このモードが有用である理由のひとつとして、伝統的な PHP 形式の警告よりも より明確にエラー処理コードが書けることがあります。例外を発生させず、 データベースへのコールのたびに毎回明示的に返り値をチェックすることに 比べると、コードの量やネストを減らすことができます。
エラーモード属性にデフォルトのERRMODE_EXCEPTION
を指定してるってことなのかな?トランザクションがロールバックされるってのは整合性が取れて良さそうだけど、このへんの記述がまだよくわかってないから勉強していこう。まとまった時間が欲しいなー。