方法和屬性可見性

可以將三種可見性型別應用於類中的方法( 類/物件函式 )和屬性( 類/物件變數 ),這些型別為應用它們的方法或屬性提供訪問控制。

你可以在 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 方法/屬性。