PHPにおけるOOPにおけるマジックを使用したプロパティの書き込み

マジックメソッド __set は、 存在しないまたは非公開のプロパティの値を 変更しようとしたときに呼び出されます。 パラメータとして、プロパティ名と 代入しようとしている値を受け取ります。

実用的な例を見てみましょう。 以下のような Test クラスがあるとします:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
  }
?>

このクラスにマジックメソッド __set を作成し、関数 var_dump を使ってアクセスされた プロパティ名と設定しようとしている値を 表示するようにしましょう:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      var_dump($property . ' ' .$value);
    }
  }
?>

クラスの動作を確認してみましょう:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // __setメソッドのvar_dumpが'prop value'を出力します
?>

次に、変数 $property に格納されている 名前のプロパティに値を設定するようにしましょう:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value; // 値を設定します
    }
  }
?>

これで、クラスの外部からプライベートプロパティに 書き込めるようになります:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // 1を書き込みます
  $test->prop2 = 2; // 2を書き込みます
?>

書き込みはできますが、そこに何か書き込まれたかどうかは、 プロパティがプライベートなので確認できません。

これらのプロパティのためのゲッターメソッドを作るか、 単にマジックメソッド __get を利用できます。 後者の方法を使ってみましょう:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // プロパティのマジックゲッター:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

これでクラスの動作を確認できるようになりました。 確認してみましょう:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // 1を書き込みます
  $test->prop2 = 2; // 2を書き込みます
  
  echo $test->prop1; // 1を出力します
  echo $test->prop2; // 2を出力します
?>

もちろん実際には、誰にでもプライベートプロパティへの 書き込みを許可すべきではありません。 そうしないと、これらのプライベートプロパティの意義が 失われてしまうからです(パブリックにしてしまえば済む話です)。

したがって、このメソッドは本当に必要な場合にのみ 使用すべきです。 次のレッスンでは、上手な活用例もさらに見ていきます。