PHP类中的可见性重要吗?为什么?

PHP类中的可见性重要吗?为什么?,php,class,private,visibility,public,Php,Class,Private,Visibility,Public,正如您所知,PHP类具有私有、公共和受保护的关键字。我刚刚开始编写类,我想知道PHP5中类可见性的优势是什么 当然还有缺点……是的,它们很重要。简单地说,它们可以防止代码在错误的地方访问内容 我不确定有什么缺点,除了声明一些受保护或私有的东西可能意味着编写getter和setter方法需要更多的工作。可见性是封装背后的主要思想之一,它支持面向对象编程(特别是适当的多态性)。您肯定应该正确地指定可见性,因为您不能保证您的类将按预期工作,否则。通过正确地使用它,您可以精确地控制如何访问类成员 我不知

正如您所知,PHP类具有私有、公共和受保护的关键字。我刚刚开始编写类,我想知道PHP5中类可见性的优势是什么


当然还有缺点……

是的,它们很重要。简单地说,它们可以防止代码在错误的地方访问内容


我不确定有什么缺点,除了声明一些受保护或私有的东西可能意味着编写getter和setter方法需要更多的工作。

可见性是封装背后的主要思想之一,它支持面向对象编程(特别是适当的多态性)。您肯定应该正确地指定可见性,因为您不能保证您的类将按预期工作,否则。通过正确地使用它,您可以精确地控制如何访问类成员


我不知道有什么缺点(除了您需要编写一些额外的代码行)。

如果您想应用诸如()之类的实践,这是很有用的

如果将类成员声明为
private
,则不能从类外的代码访问它们。您必须提供访问它们的方法。这将类的接口与实际实现分离。
使用类的其他代码不需要知道类成员的名称,也不需要知道如何在内部存储信息

例如:

考虑一个类
Books
,它会以某种方式给我一个图书列表。我可以定义一个持有一系列书籍的
public
成员:

class Books {
    public $list;
}
另一方面,如果我定义了一个方法
getList()
,我可以在以后更改实现,而不会影响使用该类的代码:

class Books {
    private $list;
    public function getList() {
         // get list from database, from XML, etc.
         // might use $list internally but does not have to
    }
}
显然,您不需要像
private
protected
public
这样的修饰符来实现此行为,但这会带来更好的结构化代码和更清晰的接口。假设您有一个既有
public$list
又有
getList()
方法的类。您如何知道使用哪一种方法?
这不仅适用于获取值,尤其适用于设置值。

使用它们没有坏处,只有好处。它们之间的区别在于可见性的范围<代码>公共成员可以从外部代码访问,
受保护
成员可以从继承类访问,
私有
成员只能从类访问

方法也可以使用这些修饰符,并遵循类似的目的。例如,如果一个方法被声明为
private
,很明显,它可能是某种助手方法,只在内部使用,不应该从外部调用


因此,最终归结为两件事:

  • 控件:可以以何种方式访问类的哪些部分
  • 自我记录或理解:使用您的类的其他人可以更容易地确定他们应该访问和不应该访问您的类的哪些部分

想象一下,如果你可以完全使用家中的电气装置,会发生什么。你要花多长时间才能烧毁大楼或自杀


内部进程可能很危险,这就是为什么安装提供了一些公共接口。在这个例子中,它将是一个插座和一个电灯开关。用电灯开关烧掉房子很难,不是吗?

让我举个例子来回答:

由客户决定(不好): 现在有了更多的控制:
使用访问说明符可以更好地保护成员/方法免受不良使用。除了要学习的内容之外,没有其他缺点。

只是一个补充:阅读类的每个人都明确地看到,他/她可以、应该、不应该或不能访问方法/属性。此外,PHP封装的最大优点之一是类型检查。与java或C++不同,PHP是动态类型化的。如果您有一个公共属性
$foo
,您希望它是一个字符串,那么您仍然可以将其更改为数组,并在执行需要它的方法时得到意外的结果。如果正在传递的值的类型错误,则通过适当的封装和设置程序可以抛出异常。@netcoder:这就是我希望在php中使用成员类型提示的原因。在许多情况下,getter/setter代码可以简化为零。例如,名称属性必须是字符串,但不能是任何字符串。但恐怕这不会很快成为现实(我不认为它有任何缺点,只是你必须多写一点代码才能使用它。除此之外,它让你完全控制你的代码及其执行,这可以克服它可能带来的任何缺点(如果有)。(相关)如果你没有用例,那么你就不用使用它们了。注意他们自己没有增加安全性,而且可靠性的增加主要是假设的。你似乎把C++和PHP混淆了……)不要忘记声明“代码> GETLIST/CODE >作为一个实际函数(即:代码>公共函数GETLIST/<代码>)@netcoder:Ah谢谢:)如果你在几种编程语言之间切换,有时很容易失去跟踪;)除了没人做那件事。大多数都是肤浅的setter和getter。@马里奥:不幸的是,许多没有经验的程序员都像你描述的那样使用getter/setter。在这种情况下,他们应该把成员们公之于众。我想这与能手/二传手的起源有关。但在脚本语言中,有时使用
\uuuu get
\uu set
是有利的,这样可以简化类型强制规则集的使用。1。您可以完全访问您的家用电气设备。你所需要的只是一条河。2.除非你很笨,否则使用安装良好的电气系统是没有危险的
class myClass
{
    public $name; // cannot contain spaces

}

$mc = new myClass();
$mc->name = 'John Smith'; // Oh no!
class myClass
{
    private $name; // cannot contain spaces

    public function setName($value)
    {
        if (strpos($value, ' ') !== false) {
            throw new Exception('Name contains space.');
        }

        $this->name = $value;
    }

    public function getName()
    {
        return $this->name;
    }

}

$mc = new myClass();
try {
    $mc->setName('John Smith');
} catch (Exception $e) {
    echo 'Cannot set name. Reason: ', $e->getMessage();
}