0

我有一个问题,长期以来一直在我脑海中盘旋。

我的模型类应该具有私有或公共属性?(以下代码是用 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 框架具有公开的模型属性?应该是有原因的吧?

4

4 回答 4

3

根据 OOP,我们需要遵循封装。请制作您的属性private并具有public访问器和修改器。但是,这取决于您的访问器和修改器也可以有其他修饰符。但是,属性应该始终是private

于 2013-11-15T09:14:23.603 回答
2

类字段应该始终是私有的。字段的 getter 和 setter 应该是公开的。除了作为标准之外,以这种方式使用它也很好,这样您就可以控制对客户端类想要设置给您的私有字段的值做任何您想做的事情。

例如,如果你想将一个对象持久化到数据库中,并且其中一列被声明为不为空,并且你不确定你的客户端类是否真的会返回一个非空值,你可以在setter 以便您将要保存到数据库的值不包含空字段,正如您的数据库表所要求的那样。

于 2013-11-15T10:15:03.927 回答
1

根据 OOP 封装原则,这些字段应始终是私有的。现在问题在于 getter 和 setter 访问器方法。

getter 通常可以安全地公开。唯一的缺点是您必须保持版本之间的向后兼容性,因为这将是该类的公共合同的一部分。因此,如果该字段是实现而不是接口的一部分,那么您可能希望对其进行保护。

至于二传手,更好的问题是是否创建一个。如果你想让你的类不可变(或至少它的某些部分)具有来自它的所有优点和缺点,那么你根本不会创建一个 setter。

于 2013-11-15T09:42:54.927 回答
0

您必须像private在模型类中一样制作所有属性,如果您必须封装它们的值,那么您必须使用适当getters and setters的方法来获取和设置它们的值。

于 2013-11-15T09:18:47.533 回答