php - 每个公共(public)属性都必须有访问器方法吗?

标签 php oop object

我正在接触 OOP,但遇到了以下困境。我有一个类:

class Recipe {

    var $title;
    var $time;
    var $ingredients = array();
    var $instructions;
    var $category;

    function __construct($title, $time, $ingredients, $instructions, $category) {

        $this->title = $title;
        ...
    }

    function getTitle() {
        return $this->title;
    }

}

所有属性都是公共(public)的(默认情况下)。我是否必须为所有这些属性定义访问器方法(例如 getTitle),或者我是否可以直接引用这些属性,如下所示:

...
$recipe = new Recipe($title, $time, $ingredients, $instructions, $category);
echo $recipe->title; // versus $recipe->getTitle();

看起来我将节省很多时间,而不必定义访问器方法。但是我想知道这种方法的优缺点是什么?

最佳答案

OOP 的黄金法则是始终将您的属性设为私有(private)!在极少数情况下允许使用公共(public)属性,但即便如此,也可能有替代解决方案。

原因是:如果您公开您的属性,任何人都可以将它们更改为他们想要的任何内容。大多数属性不能只是任何值。你的 $title 属性应该是一个整数吗?我非常怀疑。那么,如果您或其他人不小心将其设置为整数怎么办?你不会发现它。它将设置该值并且您的程序将继续运行直到失败,因为某处需要一个字符串。此外,您的属性在设置之前应该以某种方式进行验证。您可以在属性的 setter 中包含所有这些验证。

即使您不需要验证某个属性,您仍然最好将它们放在 getter 和 setter 后面,以防最终您确实需要验证它。

将您的属性设为私有(private)可确保您的对象不会在不应发生的情况下发生困惑,从而避免由此产生的任何错误。 :)

有时您会想“好吧,只有我会编辑我的代码,所以什么都不会发生”。但是,您现在应该练习这样做。养成这样做的习惯。您以后会避免任何麻烦。

关于php - 每个公共(public)属性都必须有访问器方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3460658/

相关文章:

c++ - 类型为 "const char *"的值不能分配给类型为 "char"的实体 C OOP

java - 如何在 Hibernate ORM 中优化这种 OO 设计?

php - 在函数中返回 parent::function

java - 如何计算并仅返回 ArrayList 中为真的对象?

javascript - jQuery 返回的对象的实际类型是什么

php - 如何使用vkapi库PHP

javascript - HTML 拖放 OnDrop Ajax 事件

java - 将正则表达式代码从 php 转换为 java 不起作用

javascript - PHP 对 Javascript 的验证

qt - 我可以将对象附加到 PyQt 中的 QListWidgetItems 吗?