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

例子:

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

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

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

当前回答

PHP中的变量有三种类型:

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

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

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

保护familyWealth美元;

其他回答

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

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

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

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

或者用Semver的话说:

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

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

private -只能从类内部访问

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

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

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

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

Protected:只能在对象和子类内访问。

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