LoginSignup
111
119

More than 5 years have passed since last update.

PHPのGetter/Setterについて本気出して考えてみた

Last updated at Posted at 2013-09-05

 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;
        }     
    }
}

 記述量も少なくて済む。でもデフォルト使えない。

 インターフェイス周りはまた別に。あとなんかパターンあったっけ?

111
119
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
111
119