我知道手动定义,但从实际使用的角度来看,有什么区别?你什么时候用一个而不是另一个?
答案 0 :(得分:3)
修改强> 当你想要一个子类(扩展你当前(或父类)的子类)能够访问父类中的方法或变量时,使用受保护的方法。
除了包含变量/方法的类之外,其他任何类都可以看到private 。
任何包含在同一个包/名称空间中的类都可以看到protected 。
手册中的代码。
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// We can redeclare the public and protected method, but not private
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined
?>
答案 1 :(得分:2)
当您知道变量仅在该类中使用而不在任何其他类或扩展类中时,您会将其命名为private。因此,如果你扩展该类并错误地将该变量命名为私有名称,这将给你错误,从而防止你犯错误。
例如,如果您在Web应用程序中使用了许多页面,并且所有页面都是扩展一个处理页面页眉和页脚的类(因为它始终相同)的类,您可以覆盖例如默认标题在具有受保护变量设置的父类中设置的页面。
我希望这会有所帮助。