我长期以来一直怀疑这个问题。
我的Model类应该具有私有还是公共属性? (下面的代码是用PHP编写的,但问题一般适用于任何语言)
class Xyz extends Model {
public function __call() {
}
public $description;
public $title;
}
在上面的示例中,我有公共属性$ description和$ title。我应该私有吗?
我更新我的模型如下
$x = new Xyz();
$x->title('Hello');
$x->description('Blah blah');
$x->save();
我可以使用魔术方法__call更新并获取它们。那么为什么我们需要让它们公开呢?我可以把它们变成私人的。但是当我看到所有框架都将模型属性保持公开时。
有什么想法吗?
更新
在答案中,每个人都在说跟随封装并使用私有方法。好但是没有人能解释为什么有些PHP框架公开了模型属性?应该有一些原因,不是吗?
答案 0 :(得分:2)
根据OOP,我们需要遵循封装。请设置您的属性private
并拥有public
访问者和变更者。但是,这取决于你的访问者和mutator也可以有其他修饰符。但是,属性应始终为private
。
答案 1 :(得分:1)
类字段应始终为私有字段。这些领域的吸气剂和制定者应该是公开的。除了标准之外,以这种方式使用它也是很好的,这样你就可以控制你想要的客户端类想要设置的私有字段的值。
例如,如果要将对象持久保存到数据库,并且声明一列不为null,并且您不确定您的客户端类是否真的返回非null值,则可以处理null检查setter内部,以便您将要持久保存到db的值不包含空字段,就像数据库表所需要的那样。
答案 2 :(得分:0)
您必须在模型类中将所有属性设为private
,如果必须封装其值,则必须使用适当的getters and setters
来获取和设置其值。
答案 3 :(得分:0)
根据OOP封装原则,字段应始终是私有的。现在的问题是getter和setter访问器方法。
吸气剂通常可以安全地公开。唯一的缺点是你必须保持版本之间的向后兼容性,因为这将是该类公共合同的一部分。因此,如果该字段是实现的一部分而不是接口,那么您可能希望保护它。
至于设定者,更好的问题是如果要创建一个或不。如果你想保持你的类不可变(或至少它的某些部分)具有它的所有优点和缺点,那么你根本就不会创建一个setter。