0

我一直在思考privatephp中变量和方法的使用。

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

程序员和脚本所有者使用公共或私有有什么区别。

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

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

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

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

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

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

4

3 回答 3

3

首先,当你开发strong-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.

通过首先将变量设为私有,可以完全避免这种荒谬的情况。有关每个访问修饰符的作用以及何时应用它们的更多(更好)示例,请参见此答案

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

class Foo {
    private $_bar;

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

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

$_bar在这种情况下,您是绝对正确的,这与首先将变量更改为公共没有区别。

但是,getter 和 setter 方法使您可以控制外部开发人员如何设置变量,因此您可以立即检测它们何时会发出嘘声并避免以后出现未定义的行为。例如:

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 的文章,它们都大致翻译成相同的材料。

于 2013-03-01T07:32:01.990 回答
1

最终用户看不到代码,因此那里没有(不利)优势。

对于程序员来说,在对象之外声明不需要的东西private只是一种良好的编程习惯和保护机制。从技术上讲,如果您是一个完美的程序员,并且您不关心代码的外观,那么使用private不会给您带来任何好处。但是,私有成员强制执行黑盒模型——您只关心对象做什么,而不关心它是如何工作的(从外部查看它时)。最后,如果您(或其他人)出于任何原因需要/想要使用您的代码,他们将知道使用/调用哪些方法和属性来获得功能对象具有,而无需修改对象需要维护的内部值。它可能会或可能不会给您带来任何优势——它只是关于代码的外观。这就是良好的编程实践的意义所在,并且通常会遵循它们,因为经验表明它们倾向于最大限度地减少错误。

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

于 2013-03-01T07:27:06.037 回答
0

Public、Private 和 Protected 仅在它们是函数的一部分或类的一部分时才重要。

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

公共范围以使该变量/函数可从任何地方、对象的其他类和实例中使用。

当您希望变量/函数仅在其自己的类中可见时,私有范围。

当你想让你的变量/函数在所有扩展当前类(包括父类)的类中可见时,受保护范围。

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

于 2013-03-01T07:27:54.743 回答