マジックメソッドとは
マジックメソッドは、特殊関数のこと。
マジックメソッドとして定義してあるメソッド名は、予約語と同様に作成できない。
ここでは、「__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したクラスに不可情報を付けたいときとかに便利。