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

例子:

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

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

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

当前回答

对我来说,这是理解这三种属性类型最有用的方法:

Public:当您可以在代码中的任何地方直接访问和更改此变量时,使用此选项。

类外部的示例用法:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

Protected:当你想强迫其他程序员(和你自己)在访问和设置变量时在类外部使用getter /setter时使用这个选项(但你应该保持一致,在类内部也使用getter和setter)。This或private往往是设置所有类属性的默认方式。

为什么?因为如果你决定在未来的某个时候(可能甚至在5分钟内),你想要操作该属性返回的值,或者在获取/设置之前对它做一些事情,你可以这样做,而无需重构你在项目中使用它的所有地方。

类外部的示例用法:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Private:私有属性与受保护属性非常相似。但显著的特点/区别是,将其设为私有也使得子类无法访问它,而无需使用父类的getter或setter。

因此,基本上,如果你正在为一个属性使用getter和setter(或者如果它只在父类内部使用,并且它并不意味着在其他任何地方都可以访问),你最好将它设置为私有,只是为了防止任何人试图直接使用它并引入错误。

在子类(扩展MyObject)中的使用示例:

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();

其他回答

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

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

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

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

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

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

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

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

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

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

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

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

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

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

⚡️这里有一个简单的方法来记住公共,受保护和私有的范围。

公众:

公共作用域:公共变量/函数对对象和其他类都可用。

保护:

受保护范围:受保护的变量/函数对扩展当前类的所有类可用。 不!对象不能访问此作用域

私人:

私有作用域:私有变量/函数只在定义它的当前类中可见。 不!扩展当前类的类不能访问此作用域。 不!对象不能访问此作用域。

阅读PHP手册中的方法或变量的可见性。

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

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

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

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

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

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