PHP使用中的私有方法和变量[重复]

Posted

技术标签:

【中文标题】PHP使用中的私有方法和变量[重复]【英文标题】:private methods and variables in PHP usage [duplicate] 【发布时间】:2013-02-15 15:35:20 【问题描述】:

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

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

对于程序员和脚本的所有者来说,使用 public 或 private 有什么区别。

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

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

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

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

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

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

【问题讨论】:

这些是可以在任何 oop 书籍中找到的基本问题。至于 var,这是一个古老的习俗。因此他禁止你。试着问一些在书本或谷歌中不容易回答的具体问题。 Encapsulation。 Mutator methods。 Object Oriented PHP. 所以,你不知道答案。每本书都说当您想将变量保留在类中时使用私有。 ?但为什么我需要把它放在课堂上。 ? 太防止不希望的修改? 当属性只能被定义它的类的实例访问时使用private。当属性只能由定义它的类和扩展该类的类访问时,使用protected。当任何人都可以访问该属性时,请使用public。您是否应该使用变异器是一个选择/环境问题。有利有弊。 【参考方案1】:

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

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

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

【讨论】:

+1 实际回答关于var的部分问题【参考方案2】:

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

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

使该变量/函数在任何地方都可用的公共范围, 对象的其他类和实例。

当您希望您的变量/函数在 只有它自己的类。

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

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

【讨论】:

【参考方案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.

首先将变量设为私有可以完全避免这种荒谬的情况。有关每个访问修饰符的作用以及何时应用它们的更多(和更好)示例,请参阅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 并避免 undefined以后的行为。例如:

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

【讨论】:

非常平衡的答案,而不仅仅是“因为做不同的事情是愚蠢的”。

以上是关于PHP使用中的私有方法和变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的公共和私有方法[重复]

需要在另一个页面中使用变量[重复]

PHP面向对象的特点

在继承中使用私有变量[重复]

使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]

私有类变量的字段与属性[重复]