初学者を悩ませるPHPの演算子と仲良くなろう
演算子について
プログラムのなかに頻出する->
, ::
, =>
と仲良くできていますか?私はなんとなくわかったような感覚で接していましたが、PHP と MySQL を勉強していくなかで出てきたPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
の存在が奇妙すぎて調べずにはいられなくなりました。今回は私と同じように、なんとなくわかったような感覚でいる初学者に向けて奇妙な演算子と仲良くなるための情報を一緒に紐解いていきます。読み終わる頃には、なんとなくの霧が晴れて他人のコードのなかで遭遇しても仲良くできるはずです。お菓子でも食べながらのんびりと読んでみてください。では、いきましょう。
アロー演算子->
インスタンスのメソッドやプロパティにアクセスするときに使います。
function getDb($pdo) { $stmt = $pdo->query("select * from mydb"); return $stmt; }
function getDb($pdo)
getDb という名前の関数です。仮引数として$pdo
としています。$pdo
はデータベースに接続するための方式です。ここでは$pdo
にはデータベースに関する情報が詰まっていると考えといてください。
$stmt = $pdo->query("select * from mydb");
はい、ここで出てきました->
です。これはインスタンスのメソッドやプロパティにアクセスするときに使います。ここでは$pdo
のなかにあるquery
メソッドにアクセスしてます。query
メソッドはデータベースを表示するときに使うのでselect * from mydb
と書いて「データベースmydb
のなかを全部表示して」と命令してます。その情報を$stmt
という変数に代入しました。ただ、それだけです。
return $stmt;
$stmt
を return しています。
というわけで
->
はメソッドやプロパティにアクセスするときに使うという演算子でした。さきほどの $stmt
を PHP のページで foreach を使って一覧表示させます。そのときも->
を使うので頻繁に出てきますね。
スコープ定義演算子::
**クラスのメソッドやプロパティにアクセスするときに使います。
PDO::ATTR_ERRMODE PDO::ATTR_DEFAULT_FETCH_MODE PDO::ATTR_EMULATE_PREPARES
->
はインスタンスのメソッドやプロパティにアクセスするときに使いました。::
はクラスに使います。クラス?インスタンス?
クラスとインスタンスの説明
クラスは設計図と表現されることが多いです。インスタンスはクラスが具現化されたもので「さあ、あの設計図を使うぞ!」というときにインスタンスとして登場します。インスタンス化された瞬間にメモリが確保されるので、インスタンス化させるために new を繰り返すとメモリをどんどん消費しちゃうわけです。怖いですね。その設計図となる、クラスのメソッドやプロパティにアクセスする方法がスコープ演算子である::
です。インスタンス化しなくても使えるわけですね。便利。
ダブルアロー演算子=>
連想配列のキーに値を紐付けるときに使います。人によっては代入するとも表現します。
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_EMULATE_PREPARES => false,
実はスコープ演算子のはなしのなかで出てきたコードには右辺もあったんです。今回、調べることになったきっかけがこのコードです。こんな書き方には初めて遭遇したので気持ち悪かったです。ここまで読んだみなさんなら簡単に理解できると思います。これって、ただPDO
クラスのATTR_ERRMODE
プロパティにPDO
クラスのERRMODE_EXCEPTION
プロパティを紐付けてただけなんですね。連想配列なので Key がPDO::ATTR_ERRMODE
で Value がPDO::ERRMODE_EXCEPTION
と指定しただけのはなしでした。ATTR
は Attribute で属性、EXCEPTION は例外という意味です。PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
の1行で SQL のエラーが起こった場合に人間にとって読みやすいエラーを投げてくれます。
まとめ
初学者には呪文のようにしか見えませんが、1つずつ紐解けばわかりやすいですね。私自身の備忘録としての役割にも期待して書きました。