什么是public、private和protected的区别?

1137

在类中,何时以及为什么要使用publicprivateprotected函数和变量?它们之间有什么区别?

示例:

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

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

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

69
我认为,提供每个关键词的字面含义并不足以解决问题,这个问题也需要提供实际应用示例作为答案,以使回答更加生动易懂。 - Matthew
16个回答

7

对我来说,理解三种属性类型最实用的方式是:

Public(公有):当您可以接受变量在代码中任何地方被直接访问和更改时,请使用此属性类型。

外部类的示例用法:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;
受保护的:当您想强制其他程序员(包括自己)在访问和设置变量时使用getter / setter时,请使用此选项(但您应该始终在类内部使用getter和setter)。这种方式或private往往是设置所有类属性的默认方式。
为什么?因为如果您决定在将来的某个时间点(甚至可能只有5分钟)更改返回该属性的值或在获取/设置之前对其进行操作,您可以在不重构项目中的每个使用位置的情况下执行该操作。
从类外部示例使用:
$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();
私有: private 属性与 protected 属性非常相似。但其区别在于,将其设置为 private 还会使其对子类不可访问,除非使用父类的 getter 或 setter 方法。
因此,如果您正在使用 getter 和 setter 来获取属性(或者它仅由父类内部使用,不打算在其他地方访问),那么最好将其设置为 private,以防止任何人尝试直接使用它并引入错误。
以下是在扩展 MyObject 的子类中使用示例:
$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();

6
PHP手册对这个问题有很好的解释,在这里
一个属性或方法的可见性可以通过在声明前加上关键字public、protected或private来定义。声明为public的类成员可以在任何地方访问。声明为protected的成员只能在类本身以及继承和父类中访问。声明为private的成员只能被定义成员的类访问。

5

它们存在的目的是为了允许不同级别的封装


13
你可能需要再充实一些细节。 - Russia Must Remove Putin

4

PHP中的变量分为三种类型:

Public(公共):这种变量类型的值在所有范围内都可以使用,并在执行代码时进行调用。 声明方式:public $examTimeTable;

Private(私有):这种变量类型的值仅限于其所属的类使用。 声明方式:private $classRoomComputers;

Protected(受保护):这种变量类型的值仅限于其所属类及其子类获取访问权限。通常使用::来授予父类访问权限。

声明方式:protected $familyWealth;


2
所提到的关键字是访问修饰符,它们帮助我们实现封装(或信息隐藏)。它们告诉编译器哪些其他类应该可以访问被定义的字段或方法。 private-只有当前类才能访问该字段或方法。 protected-只有当前类和该类的子类(有时也包括同一包中的类)才能访问该字段或方法。 public-任何类都可以引用该字段或调用该方法。

1

公共:是在声明变量或方法时的默认状态,可以直接被对象访问。

受保护的:只能在对象和子类中访问。

私有的:只能在对象内部被引用,不能在子类中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接