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