PHP / Basic / クラス / マジックメソッド

PHP / Basic / クラス / マジックメソッド

クラスには特別なメソッドを定義できて、それをプログラミングに応用できる。

get

このように 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

存在しないプロパティに代入された場合 __set メソッドというマジックメソッドを定義しておくことでそれに対して反応する処理が書けるようになる

class Hoge{
    public $piyo;
    function __set($name, $value){
        return $this->piyo = $name . $value;
    }
}

第一引数に呼ばれた存在しないプロパティ名、第二引数に代入しようとした値を取る。

PHP では通常の変数同様にプロパティは代入の時点で勝手に作られる。なので別に __setメソッドを定義しなくてもエラーもなく処理は進行する。

逆に何もしない __set メソッドを定義することでインスタンスの動的な拡張をブロックすることができる。

toString

画面表示等の処理でそのオブジェクトの文字列表現が必要になった場合に暗黙的にこの __toString メソッドが呼び出される。

    public function __toString() {
        return "hogehoge";
    }
php/basic/class/magic_method/start.txt · 最終更新: 2020-10-26 19:10 by ore