方法和属性可见性

可以将三种可见性类型应用于类中的方法( 类/对象函数 )和属性( 类/对象变量 ),这些类型为应用它们的方法或属性提供访问控制。

你可以在 PHP 文档中阅读有关 OOP 可见性的详细信息

上市

将方法或属性声明为 public 允许通过以下方式访问方法或属性:

  • 声明它的类。
  • 扩展声明的类的类。
  • 类层次结构之外的任何外部对象,类或代码。

这个 public 访问的一个例子是:

class MyClass {
    // Property
    public $myProperty = 'test';

    // Method
    public function myMethod() {
        return $this->myProperty;
    }
}

$obj = new MyClass();
echo $obj->myMethod();
// Out: test

echo $obj->myProperty;
// Out: test

受保护

将方法或属性声明为 protected 允许通过以下方式访问方法或属性:

  • 声明它的类。
  • 扩展声明的类的类。

不允许类层次结构外部的外部对象,类或代码访问这些方法或属性。如果使用此方法/属性的某些内容无法访问它,则它将不可用,并且将引发错误。只有声明的 self(或其子类)的实例才能访问它。

这个 protected 访问的一个例子是:

class MyClass {
    protected $myProperty = 'test';

    protected function myMethod() {
        return $this->myProperty;
    }
}

class MySubClass extends MyClass {
    public function run() {
        echo $this->myMethod();
    }
}

$obj = new MySubClass();
$obj->run(); // This will call MyClass::myMethod();
// Out: test

$obj->myMethod(); // This will fail.
// Out: Fatal error: Call to protected method MyClass::myMethod() from context ''

上面的示例指出,你只能访问其自身范围内的 protected 元素。基本上:“房子里面的东西只能从房子内部进入。”

私人的

将方法或属性声明为 private 允许通过以下方式访问方法或属性:

  • 该声明它的类 (不子类)。

private 方法或属性仅在创建它的类中可见且可访问。

请注意,相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是相同的实例。

class MyClass {
    private $myProperty = 'test';

    private function myPrivateMethod() {
        return $this->myProperty;
    }

    public function myPublicMethod() {
        return $this->myPrivateMethod();
    }

    public function modifyPrivatePropertyOf(MyClass $anotherInstance) {
        $anotherInstance->myProperty = "new value";
    }
}

class MySubClass extends MyClass {
    public function run() {
        echo $this->myPublicMethod();
    }

    public function runWithPrivate() {
        echo $this->myPrivateMethod();
    }
}

$obj = new MySubClass();
$newObj = new MySubClass();

// This will call MyClass::myPublicMethod(), which will then call
// MyClass::myPrivateMethod();
$obj->run(); 
// Out: test

    
$obj->modifyPrivatePropertyOf($newObj);

$newObj->run();
// Out: new value

echo $obj->myPrivateMethod(); // This will fail.
// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context ''

echo $obj->runWithPrivate(); // This will also fail.
// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context 'MySubClass'

如上所述,你只能从其定义的类中访问 private 方法/属性。