【问题标题】:Why make class variables private? [duplicate]为什么将类变量设为私有? [复制]
【发布时间】:2013-12-17 12:28:46
【问题描述】:

对 OOP 编程完全陌生,如果答案很明显,请见谅。我看过很多 YouTube 教程,代码如下:

class myClass{
    private $myVar;

    function getVar(){
        return $this->myVar;
    }
}

myObject = new myClass();
print myObject->getVar();

但为什么最好将变量设为私有,然后通过函数访问它,而不是只使用myObject->myVar

【问题讨论】:

标签: php oop encapsulation accessor


【解决方案1】:

您的项目越大,不同对象之间可能发生的交互次数就越多。您希望将这些交互控制并限制在最低限度,否则难以发现的副作用可能并且将会潜入您的代码。

例如,您可以有一个类来计算给定金额的税款。您不希望任何人意外将 0.05 税额更改为 3.00 并向客户收取商品价格的三倍金额,或者将税款变量的类型更改为 NULL 之类的值并导致异常/致命错误计算。

有了定居者,你可以强迫人们遵守你的规则。您可以在为私有变量赋值之前验证所有内容。

通常,一个好的做法是:将所有内容设为私有 - 然后将需要公开的内容公开 - 并为必要的私有添加所需的 gettlers 和 setters。

【讨论】:

    【解决方案2】:

    私有变量的一些好处:

    1. 未经您的许可,任何人都不能从外部更改它。如果此变量对内部状态很重要,那么当您接下来需要使用它时,让外部人员访问它可能是灾难性的(因为您的类上调用了不同的方法)。这是一件大事。
    2. 如果有人对其调用“get”,您可以拦截它并在需要时产生副作用(例如,出于会计原因;请注意,仅从纯粹的访问器来看,幕后的“魔法”通常不是一个好主意)。
    3. “get”返回的值可能不是真正的具体值,而是计算的结果。您通过该方法公开它,但它实际上并不需要在内部缓存。

    您可能还会看到here

    这有帮助吗?

    【讨论】:

      【解决方案3】:

      getset 函数可能不仅仅是获取和设置。例如,这样的事情怎么样:

      class myClass {
          private $myVar;
          public function setVar($val) {
              if( !is_numeric($val)) throw new Exception("Input must be a number");
              $this->myVar = 0+$val;
          }
      }
      

      如果$myVar 是公开的,我可以设置任何我想要的值,而不仅仅是数字,这可能会在以后导致错误。这只是一种可能的应用,有无数种用途;)

      【讨论】:

        【解决方案4】:

        在第一种情况下,您有一个 getter,而不是 setter,因此您可以“只读”私有 $myVar。在第二种情况下,$myVar 是公开的,因此您可以设置和获取 myVar。

        也许阅读更多关于 getter and setter(甚至在 stackoverflow 上)的信息以了解为什么在 OOP 设计模式中使用 getter 和 setter 更有效:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-04
          • 2019-06-05
          • 1970-01-01
          • 2013-04-16
          • 1970-01-01
          • 2012-07-23
          相关资源
          最近更新 更多