private methods and variables in PHP usage
我一直在考虑在PHP中使用
我不想谈论一类汽车或类似的事情。我想谈谈自己的剧本。
为程序员和脚本所有者使用public或private有什么区别?
如果脚本是一个计算器,而我是将来唯一一个可以输入代码的人。我什么时候必须使用方法的私有变量?这将如何改变脚本中的任何内容?
另外,如果是关于接触变量?如果有人试图改变价值,但他不能因为私事。他会直接用二传手来改变吗?
我需要一个很好的例子,我可以看到私有方法或变量对程序员或最终用户有很好的好处。
我正在编写一些脚本,有个人告诉我不要在课堂上使用
如果有直接更改变量的方法,为什么要使用setter?
如果有直接更改变量的方法,为什么要使用getter?
首先,在开发强大的OO类时,应该尽可能少地公开类的内部语义(显然不会影响功能)。
一些变量只在类本身的上下文中有价值,对于使用类的开发人员来说没有意义。将变量设为public允许任何使用该类的人随意更改此类变量,尽管他们可能不知道它的用途。在PHP中,这可能是一个特别的问题,当您甚至没有类型安全性来至少减轻可能造成的损害时。
考虑一下:您有一个类,它包装了一些I/O操作。我们叫它
1 2 3 4 5 6 7 8 9 10 11 12 | 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 } |
现在您可以看到类打开了一个文件的句柄。通过将
1 2 3 | $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都是按以下方式编写的:
1 2 3 4 5 6 7 8 9 10 11 | class Foo { private $_bar; public function getBar() { return $this->_bar; } public function setBar($newBar) { $this->_bar = $newBar } } |
在这种情况下,你是绝对正确的,这和把
但是,getter和setter方法让您可以控制外部开发人员如何设置变量,因此您可以立即检测何时会生成boo boo,并避免以后出现未定义的行为。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } } |
这不仅使类更加健壮,而且使使用类的开发人员的生活更加容易。当类试图使用
这里有大量关于变量访问和GETTE/SETER方法的文档,它适用于各种语言,所以不要害怕查找基于C++/C*/VB.NET的文章,它们都粗略地翻译成相同的材料。
最终用户看不到代码,因此没有(dis)优势。
对于程序员来说,将对象外部不需要的东西声明为
至于
public、private和protected仅在PHP中起作用,前提是它们是函数的一部分或类的一部分。
如果您想设置一次变量并"锁定它",以便以后不能更改该值,则可以将其设置为
public scope to make that variable/function available from anywhere,
other classes and instances of the object.private scope when you want your variable/function to be visible in
its own class only.protected scope when you want to make your variable/function visible
in all classes that extend current class including the parent class.
请参见:http://php.net/manual/en/language.oop5.visibility.php