最好使用私有方法还是受保护的方法?

时间:2009-01-07 10:35:14

标签: php oop

在我的很多PHP项目中,我最终得到的是具有非公共函数的类,我不打算扩展它们。

最好将这些声明为受保护或私有吗?

我可以看到两种方式的论点 - 将它们设为私有是一种更为保守的方法,但可以认为如果我希望扩展方法并且明确哪些方法被扩展,它们可以在以后被保护。基类。

另一方面,使用私有部分是反社会的,因为它阻碍了理论上未来的开发人员在不修改的情况下扩展我的代码?

10 个答案:

答案 0 :(得分:24)

我的直觉是让他们保密,直到你需要他们为止。

有人认为(遗憾的是我放错了链接)将方法设为私有是反社会的,就像使它们成为“最终”一样,因为它对于人们如何使用你的代码是相当独裁的。 p> 但是,我并不相信,并且同意你应该只公开你真正需要的东西。例外情况是库或工具包,您希望用户希望以您无法预见的方式扩展(在一般意义上)您的代码。在这种情况下,制作精心挑选的方法可以被视为提供弹性点。

答案 1 :(得分:11)

我认为你应该只在需要时公开你需要的东西。这使得对变更的影响评估更容易。即如果某个方法是私有的,那么知道如果你改变它,影响将是最小的。

答案 2 :(得分:5)

如果您打算构建一个继承类,则必须以这种方式设计它,即使这些方法受到保护,允许其他开发人员沿着您想要的方向更改类的行为。简单地使所有方法受到保护并不是一个非常好的设计。请记住,所有受保护的方法都会成为公共API的一部分,因此如果您稍后更改内容,则会破坏其他人的代码。

一般来说,如果你没有设计继承,你应该禁止它。

答案 3 :(得分:5)

就个人而言,我觉得尽可能多地保密是合适的。我只是看看每个方法,并问自己是否希望派生类能够调用它。让一切都受到保护会让方法调用不正确。

我想这可归结为“除非特别允许,否则一切都被禁止”或“除非特别禁止,否则一切都被禁止。”

另一个因素是,在将来的版本中保护私有方法很容易。一旦方法受到保护,几乎不可能对方法进行私有化,因为你永远不知道你的其他代码会失效。

答案 4 :(得分:3)

嗯,私有关键字是出于某种目的。如果你不希望变量弄乱你继承的类(或者你不希望人们在继承的类中使用它们),那你为什么还要考虑让它们受到保护呢?

不要让人碰到你的私处:)

答案 5 :(得分:3)

我通常会避免private。我的理由是,如果你有两个类之间的继承关系,并且有私有成员,那么它是一个非常强大的指示,你应该将私有部分分解为一个单独的对象。

答案 6 :(得分:1)

我会将这些方法声明为私有。它清楚地表明它们不属于公共API。

不要担心将来会发生什么。

答案 7 :(得分:1)

如果您实现的函数是特定于类的,并且不应在该类的上下文之外使用,则不要允许它继承。例如,如果我们有一个动物等级,并且其中一只动物只有一些令人难以置信的独特物,那么就像乌龟一样说“layEggsInSand()”。这对龟来说可能是完全独特的(乌龟,无论如何!)因此不应该被任何其他动物遗传。在这种情况下,我们会说它是私人的。另一方面,如果函数是“walk()”,那么它不是唯一的,因此它应该是可继承的。

起初看起来很模糊,因为大部分时间都应该继承,但是有一些罕见的情况,它们不应该被继承,因为它们对于那种类型是唯一的。

答案 8 :(得分:1)

如上所述,如果您稍后要扩展课程,则可以随时更改课程。

但是,如果你可以避免使用继承,你应该。如果可能的话,最好在设计时使用其他模式。

基本上,做什么是支持组合而不是继承和程序到接口,而不是实现。

如果你让类只有一个严格定义的目的而不是你可以合成对象而不是让它们相互继承。如果你使用接口而不是继承,你将最有可能定义小而有效的接口。然后您将看到继承将减少,因此受保护的需求将减少到。

实施例

interface sound {
 public function makeSound();
}

class bark implements sound{
 public function makeSound() {
   return "Bark!!!";  
 }
}

class mew implements sound{
 public function makeSound() {
   return "Mewmew!!!";  
 }
}

class forLeggedAnimal {
  private $sound;

  public function forLeggedAnimal($sound){
    $this->sound = $sound;
  }

  public function eat(){
    echo $this->sound->makeSound();
  }

}

$cat = new forLeggedAnimal(new mew());
$dog = new forLeggedAnimal(new bark());

我知道这远不是一个完美的例子。但它说明了这种技术,您可以通过多种方式使用它。例如,你可以将它与不同的创作模式相结合来构建猫和狗,如果猫吠或喵喵可能不是那么明智..但无论如何......它不同于必须制作基类然后扩展它与一只猫和一只狗,因此必须使“声音”方法受到保护或超越公众吃法

/彼得

答案 9 :(得分:0)

我通常在一些非常特殊的场合使用private,其中方法/变量是非常内部的,不应该由任何其他子类读取或写入(所以基本上几乎从不)。 我使用私有变量的唯一情况是例如:

final public function init():void
{
    if(!_initialized)
    {
        _init();
        _initialized = true;
    }

}

protected function _init():void
{
    // specific code.
}

在大多数情况下,方法和变量对于继承至少作为读取函数应该是有用的。 因为大多数时候我使用其他人制作的代码,并且当这段代码使用私有内容时,它总是会遇到很多麻烦:

  • 所需行为尚未实施或完成
  • 我不能使用某种方法,因为它是私有的
  • 我无法更改此方法,因为它是私有的
  • 如果它受到保护(或者如果我将其更改为受保护的)那么我就无法重做代码(也就是在其他指令之间添加行为,因为此代码的一部分使用私有方法或变量...... < / p>

    =在最后你几乎将所有访问者更改为protected以获得扩展类的能力!

因此,如果你认为这个类可以扩展,那么除了非常具体的情况之外,更喜欢保护所有内容(如果你认为只应该使用特定的方法而不是更改使用最终保护)。

如果您认为在任何情况下都不应该扩展此类:使用private。