PHP类中的可见性是否重要,为什么?

时间:2010-11-24 15:25:51

标签: php class private visibility public

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

当然也有缺点......

5 个答案:

答案 0 :(得分:10)

如果您想应用OOP Information HidingEncapsulation)等{{3}}做法,此功能非常有用。

如果您将班级成员声明为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
    }
}

显然,您不需要需要修饰符,例如privateprotectedpublic来实现此行为,但它会带来更好的结构化代码和清晰度接口。想象一下,你有一个同时拥有public $list和方法getList()的课程。你怎么知道他们使用哪一个?
这不仅适用于获取值,尤其适用于设置值。

如果你使用它们没有缺点,只有恕我直言的优点。它们之间的区别在于可见性的范围。可以从外部代码访问public个成员,只能从类中继承protected个成员和private个成员。

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


所以最后归结为两件事:

  • 控制:您的课程的哪些部分可以通过哪种方式访问​​
  • 自我记录或理解:使用您班级的其他人可以更容易地弄清楚,他们应该访问哪些课程,哪些不是。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

让我回答一个例子:

将这一切留给客户(不好):

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();
}

使用访问说明符可以更好地保护成员/方法免遭恶意使用。除了需要学习的东西之外没有其他缺点。

答案 3 :(得分:1)

想象一下,如果您可以完全访问家中的电气设备,会发生什么。在烧毁建筑物或自杀之前需要多长时间?

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

答案 4 :(得分:0)

是的,它们很重要。简而言之,它们会阻止您的代码访问错误的位置。

我不确定是否存在任何缺点,除了声明一些受保护的或私有的东西可能意味着更多的工作写一个getter和setter方法。