什么时候以及为什么我应该在类中使用公共、私有和受保护的函数和变量?它们之间的区别是什么?

例子:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

当前回答

带有抽象示例的可见范围:易于理解

属性或方法的可见性是通过预先声明三个关键字(Public、protected和private)之一来定义的。

Public:如果一个属性或方法被定义为Public,这意味着它可以被任何可以引用对象的对象访问和操作。

文摘。把公众视野想象成任何人都可以参加的“公共野餐”。

Protected:当属性或方法可见性被设置为Protected时,成员只能在类本身和继承类中访问。(继承的:一个类可以拥有另一个类的所有属性和方法)。

将受保护的可见范围视为“公司野餐”,公司成员及其家庭成员不允许进入公众。这是最常见的范围限制。

Private:当一个属性或方法可见性被设置为Private时,只有具有Private成员的类才能访问这些方法和属性(在类内部),不管它们之间可能存在什么类关系。

用野餐做类比,可以把野餐想象成“只允许公司成员参加的公司野餐”。家庭和公众都不行。

其他回答

你使用:

公共作用域,使该属性/方法可从任何地方、对象的其他类和实例使用。 当您希望您的属性/方法仅在其自己的类中可见时,则为私有作用域。 当您希望使您的属性/方法在扩展当前类(包括父类)的所有类中可见时,使用Protected作用域。

如果你不使用任何可见性修饰符,属性/方法将是公共的。

更多信息:(综合信息)

PHP手册-可见性

差异如下:

Public:类的任何用户都可以直接访问公共变量或方法。

Protected::受保护的变量或方法不能被类的用户访问,但可以在继承自该类的子类中访问。

Private::私有变量或方法只能从定义它的类内部访问。这意味着不能从扩展该类的子类调用私有变量或方法。

private -只能从类内部访问

protected -可以从类内部和继承类中访问

public -也可以从类外部的代码访问

这不仅适用于变量,也适用于函数。

所提到的关键字是访问修饰符,帮助我们实现封装(或信息隐藏)。它们告诉编译器哪些其他类应该有权访问所定义的字段或方法。

private -只有当前类可以访问字段或方法。

protected——只有这个类的当前类和子类(有时也包括同包类)可以访问该字段或方法。

public -任何类都可以引用该字段或调用该方法。

考虑到“时”: 如果我不太确定,我倾向于一开始就把所有东西都声明为私有。原因是,将私有方法转换为公共方法通常比将私有方法转换为公共方法容易得多。这是因为您至少可以确定private方法除了在类本身中没有在其他地方使用过。一个公共方法可能已经在各处使用,可能需要大量重写。

更新:我现在使用默认的protected,因为我发现它对于封装来说已经足够好了,并且当我扩展类的时候(无论如何我都尽量避免)它不会妨碍到我。只有当我有充分的理由使用另外两个时,我才会使用。

使用私有方法的一个很好的理由是,它实现了对象固有的一些东西,即使是扩展类也不应该更改(除了封装之外,还有像内部状态管理这样的事实原因)。最终,它仍然很容易追踪到一个受保护的方法通常在哪里被使用,所以我现在默认为受保护。我承认,也许不是百分百客观的“战壕”经验。