什么时候以及为什么我应该在类中使用公共、私有和受保护的函数和变量?它们之间的区别是什么?
例子:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// We can redeclare the public and protected method, but not private
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined
摘录自:
http://php.net/manual/en/language.oop5.visibility.php
带有抽象示例的可见范围:易于理解
属性或方法的可见性是通过预先声明三个关键字(Public、protected和private)之一来定义的。
Public:如果一个属性或方法被定义为Public,这意味着它可以被任何可以引用对象的对象访问和操作。
文摘。把公众视野想象成任何人都可以参加的“公共野餐”。
Protected:当属性或方法可见性被设置为Protected时,成员只能在类本身和继承类中访问。(继承的:一个类可以拥有另一个类的所有属性和方法)。
将受保护的可见范围视为“公司野餐”,公司成员及其家庭成员不允许进入公众。这是最常见的范围限制。
Private:当一个属性或方法可见性被设置为Private时,只有具有Private成员的类才能访问这些方法和属性(在类内部),不管它们之间可能存在什么类关系。
用野餐做类比,可以把野餐想象成“只允许公司成员参加的公司野餐”。家庭和公众都不行。