我应该每班使用一个getter / setter,还是每个属性使用一个getter / setter?

时间:2015-08-18 14:10:30

标签: php oop getter-setter

我已经看到很多关于是否使用getter / setter的问题和答案(例如this popular one),但我也看到了两种不同风格的getter / setter以及很少的信息模式是优选的,为什么。第一种是每个类使用1个getter和1个setter,可以通过命名方法或使用魔术方法(我的例子使用PHP,因为我每天都使用它,但我的问题适用于任何面向对象的语言)。

var total = countElementsMatching('some string', document.querySelectorAll('*'));

第二种是每个属性使用1个方法

<?php
class Foo {

    private $bar;
    private $baz;

    public function get($property)
    {
        if (property_exists($this, $property))
            return $this->$property;
    }

    public function set($property, $value)
    {
        if (property_exists($this, $property))
            $this->$property = $value;
    }

}

对于我的生活,我想不出任何理由为每个房产都有单独的方法。即使您需要单独验证,也可以在一个方法中使用开关,例如:

<?php
class Foo {

    private $bar;
    private $baz;

    public function getBar()
    {
        return $this->bar;
    }

    public function setBar($value)
    {
        $this->bar = $value;
    }

    public function getBaz()
    {
        return $this->baz;
    }

    public function setBaz($value)
    {
        $this->baz = $value;
    }

}

我错过了什么,或者每个属性是否需要一种方法?每个班级使用一个getter / setter是不错的做法?

另一个提出的选项是使用getsetters,每个属性使用一个函数来交替获取/设置值。我一直认为这违反了SOLID的单一责任原则,但正如下面给出的答案我认为我会更新问题以包含它。

5 个答案:

答案 0 :(得分:1)

我建议为每个属性使用单独的getter和setter,因为你可以输入提示setter,以及每个getter的docblock注释返回值,使代码更容易理解,并且在使用IDE时更容易编辑(自动完成,申报等)。

答案 1 :(得分:1)

我赞成第二种口头方式,但我认为这更属于品味。

每个属性使用getter / setter的优点是:

  • 其他团队成员更容易阅读和理解
  • 更容易找到特定setter / getter的用法
  • 更容易在IDE中搜索/查找getter / setter方法
  • 最好使用IDE自动填充
  • 不确定但可能对错误进行静态分析更准确
  • 检查历史记录时更好地理解代码修订
  • 我猜它比总是调用property_exists()
  • 快一点
  • 您可以撰写更好/更精确的文档

另外,请记住,如果您总是使用getter / setter,那么您也可以公开这些属性。

否则,使用getters / setters提供有限访问权限(仅提供getter)或其他行为,即setBar($value)将执行$this->value = $value ; updateOtherData();

答案 2 :(得分:0)

IMO,使用一个吸气剂&amp;每个属性的setter。这促进了对象的正确使用,从而无法在对象上使用无效。

它还增强了对对象的理解,因为您可以轻松查看对象可用的属性。它还清楚哪些属性是只读的(即,它有一个getter但没有setter)。

答案 3 :(得分:0)

建议你使用每个属性的setter / getter函数用适当的函数封装类的每个字段,我们可以在类的构造函数中使用一个setter方法。

答案 4 :(得分:0)

你的第二个例子是一种常见的方式。例如,Symfony2实际上为ORM实体创建了这样的getter / setter。

另一个有趣的解决方案,可以产生更精简的代码: Getsetters

  • 传递参​​数:设置模式
  • 传递无参数:Get-mode
  • 返回设置模式:总是$ this

所以你这样编码(几乎像jQuery)

// Setting
$myobject->name('foo')
         ->age(26);
// Getting
echo $myobject->age();
class Foo {
    private $name;
    private $age;

    public function name($name = null) {
        if( ! is_null($name)) {
            $this->name = $name;
            return $this;
        } else {
            return $this->name;
        }
    }

    public function age($age = null) {
        if( ! is_null($age)) {
            $this->age= $age;
            return $this;
        } else {
            return $this->age;
        }
    }
}