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用法详解(一看就能懂)