PHP5受保护变量背后的推理

时间:2011-03-22 20:27:51

标签: php protected

你能解释为什么我想在PHP5中的某些类变量和方法上使用“protected”与“public”或“private”的原因是什么?我还没有找到一个案例,我认为我需要“受保护”,并根据意图选择“公开”或“私人”。即使在团队合作中,我仍然没有找到一个案例(基于我迄今为止的知识)为什么“受保护”对于类变量和方法是必要的。

7 个答案:

答案 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)

我理解的方式是扩展的类不能看到私有方法和属性;而可以看到受保护的方法和属性,但只能在其定义的类中使用。

http://php.net/manual/en/language.oop5.visibility.php

答案 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可能是最重要的基本主题。

所以,我的提示是:

  • 使用OOP,这是你的朋友;
  • 使用PHP就像JAVA(一种严格的OOP语言),而不是像FORTRAN那样。