这可能看起来很简单,我确信它是,我只是没有得到它。
我知道PHP中的类中的受保护属性只能在类本身和继承的类中访问。到目前为止,这是我的代码:
class q {
public $publicQ = "This is a public property";
protected $protectedQ = "This is a proected property";
public function displayProtected() {
echo $this->protectedQ;
}
}
$q = new q;
echo $q->publicQ; #prints "This is a public property"
echo $q->protectedQ; #nothing
$q->displayProtected();
我已经阅读了文档,在SO上查看了其他答案,概念并没有点击我。受保护的属性实际上做了什么,我们为什么要使用它们?为什么我的例子不起作用?
答案 0 :(得分:2)
受保护的字段可以继承,但不能像echo $q->protectedQ;
那样显示
私人字段既不能显示也不能继承。
答案 1 :(得分:2)
将您的公共属性和方法视为您向外界展示的API,将私有/受保护的API视为您班级的“内部运作”,外部世界不仅不应该与之相提并论,而且不应该捣乱。
这是必修的坏车类比:
您在Car
课程中公开的方法可以是driveForward()
和driveBackwards()
。他们两个都会使用一个名为transmitTheDriveToTheWheels()
的方法,但它不应该关注汽车的用户,也不应该被他们访问,因此你可以通过将其隐藏起来“隐藏”它。
你的车有engine
财产。你绝对不希望有人能够通过$car->engine = $kitty;
来使用可爱的小猫来替换引擎,这样你就可以将引擎设为私有。
最后,您的车将拥有mileage
财产。您希望用户能够读取里程但不能修改它。因此,您将mileage
设为私有,并公开公开getMileage()
方法。
现在,您是想使用private还是protected来封装类的“内部”内容,取决于您是否希望扩展类。
答案 2 :(得分:0)
受保护的功能使您的课程更加灵活。
想想某个地方必须加载一些数据的类。它有一个默认实现,它从文件中读取数据。如果你想使用同一个类,但想要改变它获取数据的方式,你可以创建一个子类并覆盖getData()函数。
答案 3 :(得分:0)
正如您所发现的那样,与公共方法唯一的区别在于,只能在继承树中的类或其他类中访问受保护的函数。
当你不想在课堂外使用时,你不要将函数声明为受保护的。 这是一种语言功能,纯粹是为了使您的代码更易于理解(更易于阅读),并且不易受到错误和误用的影响。没有任何东西(以功能形式)只能使用公共方法来完成。
如果您与他人共享代码或者是某种类型的库,这非常有用。
特定于PHP,使用PHP的魔术getter和setter函数(http://www.php.net/manual/en/language.oop5.overloading.php#object.set)时有一个特别有用的案例。
public $a = '1';
protected $b = '2';
public function __get($name) {
return $this->{$name}.' (protected)';
}
$obj->a; //1
$obj->b; //2 (protected)
根据示例,您可以“保护”变量并使用魔术函数捕获调用。 如果你已经发布了一个带变量的类,那么你很有用,之后你决定在返回变量之前在类内部进行一些预处理。
答案 4 :(得分:0)
您使用受保护/私有方法来包含使代码更易于阅读的功能,并防止在公共方法中重复相同的功能。
保护属性可以保护对象不被外部修改,除非您通过setter提供访问权。
您可以更好地控制对象的使用方式。