你能解释为什么我想在PHP5中的某些类变量和方法上使用“protected”与“public”或“private”的原因是什么?我还没有找到一个案例,我认为我需要“受保护”,并根据意图选择“公开”或“私人”。即使在团队合作中,我仍然没有找到一个案例(基于我迄今为止的知识)为什么“受保护”对于类变量和方法是必要的。
答案 0 :(得分:5)
例如,Flourish library的fDate类提供了许多功能,但不是我需要的所有功能。所以我扩展了自己的班级。
我很快发现它的核心内部变量fDate :: $ date(自1970年以来的秒数)是一个私有属性。这使得不可能让我在我的子类ThriveDate中访问它。一旦Flourish的维护者将其更改为protected
属性,我就能够使用它,从而充分扩展fDate。
由于您永远不知道谁可能需要扩展您的课程,以及将来会花多少钱,所以始终最好保护每个内部属性,除非有充分的理由让该属性永远不会被修改子类强>
TL; DR:私有财产应该与公共财产一样罕见:例如:几乎没用过。
答案 1 :(得分:1)
使用protected
可以使类或任何子类的对象访问该属性。如果你想要这个限制,那么它很有用。
这不是绝对必要的,您也可以创建每个属性public
,但是您将失去访问和/或更改它的所有控件。还有一些人可能会感到困惑,所有这些“公共财产”都有利于他们获取。
另一方面,您可以创建每个属性private
,但是每个子类都不能再访问它。
答案 2 :(得分:1)
现实生活中的例子如何:
<?
// burguers.php
/* abstract */ class BurguerClass {
// nobody knows about these secret function
private function addSecretRecipeSauce() { ... }
// these one can can change in subclasses
// cannot be called globally
protected /* virtual */ function addBread() { ... }
protected /* virtual */ function addSalad() { ... }
protected /* virtual */ function addMeat() { ... }
protected /* virtual */ function addExtraIngredients() { ... }
// these one it can be access globally
public /* virtual */ function makeBurguer() {
$this->addBread();
$this->addSalad();
$this->addMeat();
$this->addExtraIngredients();
$this->addSecretRecipeSauce();
}
}
/* concrete */ class CheeseBurguerClass extends BurguerClass {
protected /* virtual */ function addCheese() { ... }
public /* override */ function makeBurguer() {
$this->addBread();
$this->addSalad();
$this->addMeat();
$this->addExtraIngredients();
// we add this one:
$this->addCheese();
}
}
/* concrete */ class RanchStyleBurguerClass extends BurguerClass {
protected /* override */ function addExtraIngredients() { ... }
}
/* concrete */ class EastCoastVegetarianStyleBurguerClass extends BurguerClass {
protected /* override */ function addMeat() {
// use soy "meat"
}
protected /* override */ function addExtraIngredients() { ... }
}
function burguers_main() {
$Cheesburguer = new CheeseBurguerClass();
// can be access
$Cheesburguer->makeBurguer();
}
// execute it
burguers_main();
?>
您只需打开“我可以拥有Cheesburguer”软件开发公司。你是C.E.O.,你有几个下属。你教下属他们可以根据“burguerClass”配方制作新产品,并制作新的食谱。
您告诉您的员工如何“addBread”,“addSalad”,“addMeat”,“addExtraIngredients”,以及新操作可以更改操作,但不能单独出售,只能用于“makeBurguer”操作
但是,你不要教你的员工“addSecretRecipe”操作。
答案 3 :(得分:0)
我理解的方式是扩展的类不能看到私有方法和属性;而可以看到受保护的方法和属性,但只能在其定义的类中使用。
答案 4 :(得分:0)
在设计课程时,拥有私人和公共是不正常的 变量或属性。
当然,我的OOP经验非常有限 访问CA-Visual Objects,Clipper,VB和ASP中的OOP开发。
但是拥有一系列可以访问的公共属性是正常的 直接然后是属性,只能由类本身访问。
当然在VB和ASP中,这些是使用Get,Let和Set方法定义的, 但你仍然可以直接访问它们。
您也可以设计只读的属性。 也许这是因为运营商超载......
答案 5 :(得分:0)
我使用受保护的方法和属性而不是私有主要用于测试目的。这样,在编写单元测试时创建类模拟会更容易。
答案 6 :(得分:0)
OOP并没有结束将代码组织到类中(因为结构化编程不会在将代码分割为函数时结束)。 PHP是一种脚本语言,因此在将其用作OOP语言时,我们应该为自己设置约束。
我很幸运,当我第一次见到OOP时,语言是Java,这本书是Bruce Ekcel - Thinking in Java(您可以在亚马逊或其他商店购买,以前的版本也可以从这里免费下载:http://www.mindviewinc.com/Books/downloads.html)。即使是PHP程序员,我也可以推荐这本书。如果您不是初学者,您将了解所有内容,并将其应用于PHP。我正在尝试使用PHP进行编程,就好像它是Java(至少是OOP部分; Java中没有像PHP那样很酷的关联数组)。
此外,私人,受保护和公共类别不太精确。 Public应该拆分为“API方法”和“可以从其他类调用”(参见“友好”),受保护应区分“应该被覆盖”和“必须实现”。
学习OOP,这是值得的。
还有一件事我想说,OOP的一个基本模式:使用getter / setter,不使用公共属性,如果你使用公共属性,你只是将它刻划成摇滚。比如,有一个状态标志,现在它有两个可能的状态值,但如果你想扩展它,所有代码都必须修改,使用它。使用setState()和getState(),其函数首先是简单的( $ this-&gt; state = $ param; 和返回$ this-&gt; state ),但是扩展状态的含义没有问题,那么你应该只重写这些方法,即使在这种情况下,如果状态是一个派生值(例如,它的值是从更多的标志计算的)。
在OOP中有几个或多个深度相似的主题,这个getter / setter可能是最重要的基本主题。
所以,我的提示是: