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

例子:

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

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

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

当前回答

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

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

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

其他回答

差异如下:

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

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

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

又提了一个老问题,但我认为从你所定义的API的角度来考虑这个问题是一个很好的方法。

public——所有标记为public的东西都是API的一部分,任何使用你的类/接口/其他的人都会使用和依赖它。 protected -不要被愚弄了,这也是API的一部分!人们可以子类化,扩展你的代码,使用任何标记为受保护的东西。 private -私有属性和方法可以随心所欲地更改。没有其他人可以使用这些。这些是唯一可以在不进行破坏性更改的情况下进行更改的内容。

或者用Semver的话说:

对任何公共或受保护的内容的更改都应被视为重大更改。 任何新的公开或受保护的内容(至少)都应该是MINOR 只有对任何私有内容的新/更改才能被PATCH

因此,在维护代码方面,注意哪些内容是公开的或受保护的,因为这些是你向用户承诺的内容。

PHP中的变量有三种类型:

Public:该变量类型的值在所有范围内可用,并在代码执行时调用。 声明为:public $ examschedule;

Private:此类型变量的值仅在它所属的类上可用。 私人classRoomComputers美元;

Protected:该类的值仅且仅在以继承或其子类的形式授予Access时可用。通常使用::授予父类访问权限

保护familyWealth美元;

PHP手册中有关于这个问题的很好的读物。

属性或方法的可见性可以通过在声明前加上关键字public、protected或private来定义。声明为public的类成员可以在任何地方访问。声明为protected的成员只能在类本身以及继承类和父类中访问。声明为private的成员只能由定义该成员的类访问。

通常认为最佳实践是默认为所需的最低可见性,因为这可以促进数据封装和良好的接口设计。在考虑成员变量和方法可见性时,要考虑成员在与其他对象的交互中所扮演的角色。

如果你“为接口而不是实现编码”,那么做出可见性决策通常是相当简单的。一般来说,变量应该是私有的或受保护的,除非您有充分的理由公开它们。使用公共访问器(getter /setter)来限制和规范对类内部的访问。

以汽车为例,速度、档位和方向等都是私有实例变量。你不希望司机直接操纵像空气/燃料比这样的事情。相反,您将有限数量的操作公开为公共方法。汽车的接口可能包括加速()、减速()/刹车()、setGear()、turnLeft()、turnRight()等方法。

司机不知道也不应该关心这些动作是如何由汽车内部实现的,暴露这些功能可能会对司机和路上的其他人造成危险。因此,设计一个公共接口并将数据封装在该接口后面是一个很好的实践。

这种方法还允许您更改和改进类中公共方法的实现,而不会破坏接口与客户端代码的约定。例如,你可以改进accelerate()方法,使其更省油,但该方法的使用将保持不变;客户端代码不需要更改,但仍然可以获得效率提高的好处。

编辑:既然你似乎还在学习面向对象的概念(它比任何语言的语法都更难掌握),我强烈建议你去读Matt Zandstra的《PHP对象、模式和实践》。这是第一本教会我如何有效地使用OOP的书,而不仅仅是教我语法。我在几年前就已经学过语法了,但如果不理解OOP的“原因”,这是没有用的。