php [php:accessor] setter / getter模式备忘录。 #PHP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php [php:accessor] setter / getter模式备忘录。 #PHP相关的知识,希望对你有一定的参考价值。

## 基本形
プロパティ(フィールド)を全部Privateにして値の読み書きをメソッド軽油にするのが基本。プロパティの数だけ用意する必要があるけど、カプセル化したまま固有処理をつけ足したりできる。

```
class Person{
    private $name;

    public function get_name($name){
        return $this->name;
    }

    public function set_name($name){
        $this->name = $name;
    }
}
```


## 配列汎用型
ぶっちゃけほとんどのプロパティに固有の処理なんかないから、プロパティは全部配列にしちゃってそれをget('hoge')とかset('hoge')とかして弄りまわそう。なかったときは$defaultを返そう。というユーティリティ設計。

```
class Person{
    private $var = [];

    public function get($key,$default=null){
        if(array_key_exists($key,$this->var)){
            return $this->var[$key];
        }
        return $default;
    }

    public function set($key,$value){
        $this->var[$key] = $value;
    }
}
```


## マジックメンバ使うやつ
### 基本形
public だけど readonly な値をなんとか実装したいなぁと思ったら、PHPの場合は private にして [ 存在しない変数・関数を読んだときに呼ばれるマジックメンバ ] を拡張してうまいことやるしかない。
```
  public function __set($key,$value){
    $this->set($key,$value);
  }//__set()
  
  public function set($key,$value){
    if(property_exists($this,$key)){
      $this->$key = $value;
      return true;
    }//if
    return false; 
  }//set()
  
  public function __get($key){
    if(property_exists($this,$key)){
      return $this->$key
    }
    return null;
  }//__get()

  public function get($key,$default=null){
    if(property_exists($this,$key)){
      return $this->$key;
    }//if
    return $default;
  }//get()
```

### 配列変数+マジック
```
class Person{
    private $var = [];

    public function __set($key,$value){
        $this->set($key,$value);
    }

    public function set($key,$value){
        $this->var[$key] = $value;
    }

    public function __get($key,$default=null){
        $this->get($key,$default);
    }

    public function get($key,$default=null){
        if(array_key_exist($key,$this->var)){
            retrun $this->var[$key];
        }
        return $default;
    }

}
```
<?php 
namespace App\Component;

/**
 * Accessor : ReadOnly
 * @access public
 * @category Utility
 * @package App\
 */
trait AccessorReadOnly {
  
  public function __get($key) {
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return null;
  }

  public function get($key,$default=null) {
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return $default;
  }
  
}
<?php 
namespace App\Component;

/**
 * Accessor
 * @access public
 * @category Utility
 * @package App\
 */
trait Accessor {
  
  public function __set($key,$value) {
    $this->set($key,$value);
  }
  
  public function set($key,$value) {
    if (property_exists($this,$key)) {
      $this->$key = $value;
      return true;
    }
    return false; 
  }
  
  public function __get($key){
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return null;
  }

  public function get($key,$default=null) {
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return $default;
  }
  
}
<?php 
namespace App\Component;

/**
 * Accessor
 * @access public
 * @category Utility
 * @package App\
 */
trait Accessor {
  
  public function __set($key,$value) {
    $this->set($key,$value);
  }
  
  public function set($key,$value) {
    if (property_exists($this,$key)) {
      $this->$key = $value;
      return true;
    }
    return false; 
  }
  
  public function __get($key) {
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return null;
  }

  public function get($key,$default=null) {
    if (property_exists($this,$key)) {
      return $this->$key;
    }
    return $default;
  }
  
}

以上是关于php [php:accessor] setter / getter模式备忘录。 #PHP的主要内容,如果未能解决你的问题,请参考以下文章

@Accessors 注解参数

PHP PHP Getters和Setters

Rails 模块中的 mattr_accessor 是啥?

不要在init和dealloc函数中使用accessor

PHP getter和setter

lombok @Accessors用法详解(一看就能懂)