PHPのGetter,Setterいろんな書き方があると思います。いろいろありすぎて困ってるくらいです。
##基本型
class Person{
private $name;
public function get_name($name){
return $this->name;
}
public function set_name($name){
$this->name = $name;
}
}
まぁこの辺は問題ない。気になるのはSetterでtrue
返すのん。あれはなんなの?そういうマナー?とりあえずこのドキュメントではreturn true しませんので。
##配列型
プロパティが多くなってくると配列になったりする。
配列基本型
class Person{
private $var = [];
public function get_name($default=null){
if(array_key_exist($name,$this->var)){
retrun $this->var[$name];
}
return $default;
}
public function set_name($name){
$this->var["name"] = $name;
}
}
んでgetter/setter書くのも面倒になってきて汎用化してく。
配列汎用getter/setter型
class Person{
private $var = [];
public function get($key,$default=null){
if(array_key_exist($key,$this->var)){
retrun $this->var[$key];
}
return $default;
}
public function set($key,$value){
$this->var[$key] = $value;
}
}
このへんまではまだ良く見る感じ。汎用getterは個人的に好きじゃない。文字列で渡すところがなんか好きじゃない。でも使うけど。
defaultなんてものの扱いをどうするか、ってあたりはかなり好みの別れる所。そこは例外投げて欲しいよねって場面もあるかと思うので柔軟に。
##マジックメンバ型
配列要素でも、マジックプロパティとか使って上手いことプロパティっぽくアクセス出来るようにする、みたいな時もある。
マジックプロパティ型
class Person{
private $var = [];
public function __get($key){
return $this->get($key);
}
public function __set($key,$value){
$this->set($key,$value);
}
public function get($key,$default=null){
if(array_key_exist($key,$this->var)){
retrun $this->var[$key];
}
return $default;
}
public function set($key,$value){
$this->var[$key] = $value;
}
}
多分潔癖な人はマジックメソドの方を好む。
マジックメソド型
class Person{
private $var = [];
public function __call($name, $args)
{
if (strncmp($name, 'get_', 4) === 0)
{
return $this->get(substr($name, 4), reset($args));
}else (strncmp($name, 'set_', 4) === 0)
{
return $this->set(substr($name, 4), reset($args));
}
throw new \BadMethodCallException('Method "'.$name.'" does not exist.');
}
public function __set($key,$value){
$this->set($key,$value);
}
public function get($key,$default=null){
if(array_key_exist($key,$this->var)){
retrun $this->var[$key];
}
return $default;
}
public function set($key,$value){
$this->var[$key] = $value;
}
}
##Getter/Setter共通型
あんまり見ないけどこういう変態的なのはPHPっぽくて好きです。
配列汎用getter/setter型
class Person{
private $name = [];
public function name($value = null){
if(func_num_args()){
$name = $value;
}else{
return $name;
}
}
}
記述量も少なくて済む。でもデフォルト使えない。
インターフェイス周りはまた別に。あとなんかパターンあったっけ?