menu
書いてる野郎
orebike@gmail.com
クラスには特別なメソッドを定義できて、それをプログラミングに応用できる。
このように piyo というプロパティが存在しないのにアクセスされた時に呼び出される特別なメソッドがある
$p = $hoge->piyo;
存在しないプロパティが呼ばれた場合 __get
というマジックメソッドを定義しておくことでそれに対して反応する処理が書けるようになる
class Hoge{ function __get($name){ return $name; } }
第一引数に呼ばれた存在しないプロパティ名を取る。
PHPではインスタンスに対して存在しないプロパティに代入すると自動的にプロパティが出来上がるが、この自動的に出来上がったプロパティも検索対象になる。
つまりクラスのメンバとして定義していなくても代入として拡張したプロパティがあるならば __get
メソッドは呼び出されない。
ということは内部で自動的にプロパティを作れば一回だけ計算させて後は結果だけ使うという動きもカンタンに実現できる。
class Hoge{ function __get($name){ return $this->$name = $name . "ほげほげ"; } }
PHPではアロー演算子の先にドル付きで変数を取ると、その変数の内容でプロパティを解決しにいく。
__get
メソッドの引数である未知のプロパティ名で動的にプロパティが拡張することができる。
そこに値を突っ込む。2回目からはもうすでに拡張されているので __get
メソッドを経由せずに値を得ることができる。処理なら2度目を省略できるし、参照ならば同じものを指すことになる。
存在しないプロパティに代入された場合 __set
メソッドというマジックメソッドを定義しておくことでそれに対して反応する処理が書けるようになる
class Hoge{ public $piyo; function __set($name, $value){ return $this->piyo = $name . $value; } }
第一引数に呼ばれた存在しないプロパティ名、第二引数に代入しようとした値を取る。
PHP では通常の変数同様にプロパティは代入の時点で勝手に作られる。なので別に __set
メソッドを定義しなくてもエラーもなく処理は進行する。
逆に何もしない __set
メソッドを定義することでインスタンスの動的な拡張をブロックすることができる。
画面表示等の処理でそのオブジェクトの文字列表現が必要になった場合に暗黙的にこの __toString
メソッドが呼び出される。
public function __toString() { return "hogehoge"; }