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

例子:

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

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

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

当前回答

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

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

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

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

其他回答

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

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

private -只能从类内部访问

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

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

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

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

公众:

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

保护:

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

私人:

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

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

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

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

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

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

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

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

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

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

/**
 * 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