PHPにおけるOOPにおけるマジックを使用したプロパティの書き込み
マジックメソッド __set は、
存在しないまたは非公開のプロパティの値を
変更しようとしたときに呼び出されます。
パラメータとして、プロパティ名と
代入しようとしている値を受け取ります。
実用的な例を見てみましょう。
以下のような Test クラスがあるとします:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
このクラスにマジックメソッド
__set を作成し、関数
var_dump を使ってアクセスされた
プロパティ名と設定しようとしている値を
表示するようにしましょう:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
クラスの動作を確認してみましょう:
<?php
$test = new Test;
$test->prop = 'value'; // __setメソッドのvar_dumpが'prop value'を出力します
?>
次に、変数 $property に格納されている
名前のプロパティに値を設定するようにしましょう:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // 値を設定します
}
}
?>
これで、クラスの外部からプライベートプロパティに 書き込めるようになります:
<?php
$test = new Test;
$test->prop1 = 1; // 1を書き込みます
$test->prop2 = 2; // 2を書き込みます
?>
書き込みはできますが、そこに何か書き込まれたかどうかは、 プロパティがプライベートなので確認できません。
これらのプロパティのためのゲッターメソッドを作るか、
単にマジックメソッド __get を利用できます。
後者の方法を使ってみましょう:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// プロパティのマジックゲッター:
public function __get($property)
{
return $this->$property;
}
}
?>
これでクラスの動作を確認できるようになりました。 確認してみましょう:
<?php
$test = new Test;
$test->prop1 = 1; // 1を書き込みます
$test->prop2 = 2; // 2を書き込みます
echo $test->prop1; // 1を出力します
echo $test->prop2; // 2を出力します
?>
もちろん実際には、誰にでもプライベートプロパティへの 書き込みを許可すべきではありません。 そうしないと、これらのプライベートプロパティの意義が 失われてしまうからです(パブリックにしてしまえば済む話です)。
したがって、このメソッドは本当に必要な場合にのみ 使用すべきです。 次のレッスンでは、上手な活用例もさらに見ていきます。