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