如您所知,PHP类具有私有,公共和受保护的关键字。我刚刚开始编写类,我想知道PHP5中类可见性的优点是什么。
当然也有缺点......
答案 0 :(得分:10)
如果您想应用OOP Information Hiding(Encapsulation)等{{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
}
}
显然,您不需要需要修饰符,例如private
,protected
或public
来实现此行为,但它会带来更好的结构化代码和清晰度接口。想象一下,你有一个同时拥有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方法。