11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マジックメソッド「__set()」「__get()」

Last updated at Posted at 2015-06-05

マジックメソッドとは

マジックメソッドは、特殊関数のこと。
マジックメソッドとして定義してあるメソッド名は、予約語と同様に作成できない。

ここでは、「__set()」「__get()」をメモ。
(↑アンダーバーは2つついてる。↑)


「__set()」「__get()」とは

クラスA.phpがあるとして、外部からA.phpで宣言されていないフィールドにアクセスするときに使用する。
以下、実際のソースで説明を。


まずは至って普通のコード。
newしたクラスのフィールドにアクセスしてるだけ。

Property.php
<?php
    class Property{
        public $food;
    }

    $pro = new Property();
    $pro->food = "さんまの塩焼き";
    var_dump($pro->food);
?>

続いて、宣言していないフィールドにアクセス。
実行すると、「__set()」「__get()」の中に入ってるのが分かる。
(改行されないときは「画面右クリック」→「ページのソースを表示」
で見ると分かり易いかと思われ。)

Property.php
<?php
    class Property{
        public $food;

        public function __set($name, $value){
            echo "__set()なう\n";
        }

        public function __get($name){
            echo "__get()なう\n";
        }
    }

    $pro = new Property();
    $pro->food = "さんまの塩焼き";
    var_dump($pro->food);
    $pro->drink = "いろはす";
    var_dump($pro->drink);

/* 実行結果は、以下の通り。
    string(21) "さんまの塩焼き"
      __set()なう
      __get()なう
      NULL
*/
?>

あとは
「__set()」で値を格納し、「__get()」でそれを取り出す処理を追加。

Property.php
<?php
    class Property{
        public $food;
    //存在しないフィールドにアクセスされたら、ここを参照するようにする
    private $drinker = array();

        public function __set($name, $value){
            echo "__set()なう\n";
      //連想配列として格納
      $this->drinker[$name] = $value;
        }

        public function __get($name){
            echo "__get()なう\n";
       //連想配列から$nameに対応する$valueを返す
       return $this->drinker[$name];
        }
    }

    $pro = new Property();
  $pro->food = "さんまの塩焼き";
  var_dump($pro->food);
    $pro->drink = "いろはす";
    var_dump($pro->drink);
    $pro->drink = "ポカリ";
    var_dump($pro->drink);

/* 実行結果は、以下の通り。  
   string(21) "さんまの塩焼き"
   __set()なう
   __get()なう
   string(12) "いろはす"
   __set()なう
   __get()なう
   string(9) "ポカリ"
*/
?>

newしたクラスに不可情報を付けたいときとかに便利。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?