PHP使用中的私有方法和变量

时间:2013-03-01 07:18:25

标签: php oop

我一直在考虑在php中使用private变量和方法。

我不会谈论一类汽车或类似的东西。我想谈谈自己的剧本。

对程序员和脚本所有者使用public或private之间有什么区别。

如果脚本是计算器,我是唯一一个将来会发布代码的人。我何时必须使用方法的私有变量。这将如何改变脚本中的任何内容?

另外,如果它是关于触摸变量?如果有人试图改变价值,他不能因为私人的事情。他会直接用改编者改变它吗?

我需要一个很好的例子,我可以看到私有方法或变量对程序员或最终用户有很好的好处。

我正在编写一些脚本,一个人告诉我不要在课程中使用var。我问他为什么?他说你必须使用公共或私人..并问为什么?

如果有办法直接更改变量,为什么要使用setter?

如果有办法直接更改变量,为什么要使用getter?

3 个答案:

答案 0 :(得分:3)

首先,当你开发强-OO类时,你应该尽可能少地暴露你的类的内部语义(显然不会影响功能)。

有些变量只在类本身的上下文中有价值,对使用该类的开发人员没有任何意义。使变量公开允许任何使用该类的人随意更改这样的变量,尽管事实上他们可能不知道它的用途。在PHP中,当你甚至没有类型安全性来至少减轻可以造成的伤害时,这可能是一个特殊的问题。

考虑一下:你有一个包含一些I / O操作的类。我们称之为FileReader

class FileReader {
    public $_handle;

    public function __construct($filepath) {
        $this->_handle = fopen($filepath, 'r');
        if ($this->_handle === NULL) {
            throw new Exception("Unable to open the file for reading");
        }
    }

    // ... the rest of the class
}

现在您可以看到该类打开了文件句柄。通过公开$_handle变量,您已将其公开给任何在您班级上工作的人。他们不需要知道你打开的原始文件句柄,他们只是想使用你的好类来执行一些读操作。但是,它是公开的;他们不仅可以看到它,而且可以改变它。这很糟糕,尤其是当您的其他代码假定$_handle变量有效时。

$reader = new FileReader();
$reader->_handle = "I hope this doesn't break anything. /trololol";
$reader->someOperation(); // oh no! Our file handle has just been changed to something completely wrong, this is now going to the break the class.

通过首先将变量设为私有,可以完全避免这种荒谬的场景。有关每个访问修饰符的更多(和更好)示例,以及何时应用它们,请参阅this answer

现在,进入getter和setter。在你的问题中,你似乎假设所有的getter和setter都是按照以下方式编写的:

class Foo {
    private $_bar;

    public function getBar() {
        return $this->_bar;
    }

    public function setBar($newBar) {
        $this->_bar = $newBar
    }
}

在这种情况下,你绝对正确,并且首先将$_bar变量更改为公开,之间没有区别。

但是,使用getter和setter方法可以控制外部开发人员设置变量的 ,这样您就可以立即检测到他们何时会制作一个boo-boo并避免未定义以后的行为。例如:

class Foo {
    private $_bar;

    public function getBar() {
        return $this->_bar;
    }

    public function setBar($newBar) {
        // Now we're going to ensure that $newBar is always an integer
        if (!is_int($newBar)) {
            // not an integer, throw out an exception to let the developer know that somewhere is setting invalid input
            throw new Exception("Expected an integer value for 'Bar'");
        }
        $this->_bar = $newBar;
    }
}

这不仅使您的课程更加健壮,而且使您的课程开发人员的生活变得更加容易。当类试图使用$_bar的损坏值时,不必在某个地方调试一个非常奇怪的问题,他们可以很容易地从堆栈跟踪告知设置了损坏值的位置并在源处修复它。

有大量关于变量访问和getter / setter方法的文档,它适用于各种语言,所以不要害怕查找基于C ++ / C#/ VB.NET的文章,他们都大致翻译成相同的材料。

答案 1 :(得分:1)

最终用户没有看到代码,所以那里没有(dis)优势。

对于程序员来说,将对象外部不需要的东西声明为private只是一种很好的编程习惯和保护机制。从技术上讲,如果您是一个完美的程序员,并且您不关心代码的外观,那么使用private将无法为您提供任何好处。但是,私人成员强制执行黑匣子模型 - 您只关心对象的作用,而不关心它是如何工作的(当从外部看时)。最后,如果您(或其他人)因任何原因需要/想要使用您的代码,他们将知道使用/调用哪些方法和属性以获得功能该对象具有,无需修改对象需要维护的内部值。它可能会或可能不会给你带来任何好处 - 它只是关于代码的样子。这就是优秀的编程实践,并且通常会遵循它们,因为经验表明它们倾向于最小化错误。

至于var,它已被弃用。这意味着将来可以(并将会)将其删除。

答案 2 :(得分:0)

Public,Private和Protected只在PHP中有效,如果它们是函数的一部分或类的一部分。

如果您想设置一次变量并“锁定”以便以后无法更改该值,您可以define将其设置为const(常量)。

  

使公共范围可以从任何地方提供该变量/功能,   该对象的其他类和实例。

     当您希望变量/函数可见时,

私有范围   只有自己的班级。

     

当您想要使变量/函数可见时,保护范围   在所有扩展当前类的类中,包括父类。

见这里:http://php.net/manual/en/language.oop5.visibility.php