プログラミングいちねんせい

プログラミング歴ゼロの初心者がもがくサイトです

PHPのスコープ

以下はDBに接続してデータを表示するときの例外処理ですが$pdoをスコープの外から呼び出せることに気づかず頭が混乱しました。JAVAJavaScript では無理だったような気がする。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を指定してるってことなのかな?トランザクションロールバックされるってのは整合性が取れて良さそうだけど、このへんの記述がまだよくわかってないから勉強していこう。まとまった時間が欲しいなー。