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

例子:

// 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:只能在对象中引用,不能在子类中引用。

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

公众:

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

保护:

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

私人:

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

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

你使用:

公共作用域,使该属性/方法可从任何地方、对象的其他类和实例使用。 当您希望您的属性/方法仅在其自己的类中可见时,则为私有作用域。 当您希望使您的属性/方法在扩展当前类(包括父类)的所有类中可见时,使用Protected作用域。

如果你不使用任何可见性修饰符,属性/方法将是公共的。

更多信息:(综合信息)

PHP手册-可见性

考虑到“时”: 如果我不太确定,我倾向于一开始就把所有东西都声明为私有。原因是,将私有方法转换为公共方法通常比将私有方法转换为公共方法容易得多。这是因为您至少可以确定private方法除了在类本身中没有在其他地方使用过。一个公共方法可能已经在各处使用,可能需要大量重写。

更新:我现在使用默认的protected,因为我发现它对于封装来说已经足够好了,并且当我扩展类的时候(无论如何我都尽量避免)它不会妨碍到我。只有当我有充分的理由使用另外两个时,我才会使用。

使用私有方法的一个很好的理由是,它实现了对象固有的一些东西,即使是扩展类也不应该更改(除了封装之外,还有像内部状态管理这样的事实原因)。最终,它仍然很容易追踪到一个受保护的方法通常在哪里被使用,所以我现在默认为受保护。我承认,也许不是百分百客观的“战壕”经验。

PHP中的变量有三种类型:

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

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

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

保护familyWealth美元;