为什么将类变量设为私有?

时间:2013-12-01 21:24:12

标签: php oop encapsulation accessor

完全不熟悉OOP编程,如果答案显而易见,那就很抱歉。我见过很多YouTube教程,代码如下:

class myClass{
    private $myVar;

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

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

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

4 个答案:

答案 0 :(得分:1)

私有变量的一些好处:

  1. 未经您的许可,任何人都无法从外部更改。如果这个变量对于内部状态很重要,那么当你需要在外面访问它时,它可能是灾难性的(因为你的类上有不同的方法调用)。这是一个大问题。
  2. 如果有人在上面调用“get”,你可以拦截它并在需要时创建副作用(例如,出于会计原因;注意幕后的“魔术”通常不仅仅是一个纯粹的访问者)。
  3. “get”返回的值可能不是真正的具体值,而是计算的结果。您通过该方法公开它,但它实际上不需要在内部缓存。
  4. 您可能还会看到here

    这有用吗?

答案 1 :(得分:0)

在第一种情况下,你有一个getter,而不是一个setter,所以你可以“只读”私有的$ myVar。在第二种情况下,$ myVar是公共的,所以你可以设置并获得myVar。

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

答案 2 :(得分:0)

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是公开的,我可以设置我想要的任何值,而不仅仅是数字,这可能会导致以后出错。这只是一个可能的应用程序,有无数的用途;)

答案 3 :(得分:0)

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

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

使用定居者,您可以强迫人们遵守您的规则。您可以在将值分配给私有变量之前验证所有内容。

通常,一种好的做法是:让一切都变得私密 - 然后公开需要公开的东西 - 并为必要的私人提供必要的掠夺者和定居者。