本页目录
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
在子类中,可以对 public(公有)和 protected(受保护)进行重定义,但 private(私有)而不能
属性的访问控制
类属性必须定义为公有,受保护,私有之一。
如果用 var 定义,则被视为公有。
<?php/** * 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; // 这行能被正常执行echo $obj->protected; // 这行会产生一个致命错误echo $obj->private; // 这行也会产生一个致命错误$obj->printHello(); // 输出 Public、Protected 和 Private
/** * Define MyClass2 */class MyClass2 extends MyClass{ // 可以对 public 和 protected 进行重定义,但 private 而不能 protected $protected = 'Protected2';
function printHello() { echo $this->public; echo $this->protected; echo $this->private; }}
$obj2 = new MyClass2();echo $obj2->public; // 这行能被正常执行echo $obj2->private; // 未定义 private,私有的类成员则只能被其定义所在的类访问echo $obj2->protected; // 这行会产生一个致命错误$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>注意,什么是类,什么是对象(类的实例)
方法的访问控制
类中的方法可以被定义为公有,私有或受保护。
如果没有设置这些关键字,则该方法默认为公有。
<?php/** * Define MyClass */class MyClass{ // 声明一个公有的构造函数 public function __construct() { }
// 声明一个公有的方法 public function MyPublic() { }
// 声明一个受保护的方法 protected function MyProtected() { }
// 声明一个私有的方法 private function MyPrivate() { }
// 此方法为公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); }}
$myclass = new MyClass;$myclass->MyPublic(); // 这行能被正常执行$myclass->MyProtected(); // 这行会产生一个致命错误$myclass->MyPrivate(); // 这行会产生一个致命错误$myclass->Foo(); // 公有,受保护,私有都可以执行
/** * Define MyClass2 */class MyClass2 extends MyClass{ // 此方法为公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 这行会产生一个致命错误 }}
$myclass2 = new MyClass2;$myclass2->MyPublic(); // 这行能被正常执行$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar{ public function test() { $this->testPrivate(); $this->testPublic(); }
public function testPublic() { echo "Bar::testPublicn"; }
private function testPrivate() { echo "Bar::testPrivaten"; }}
class Foo extends Bar{ public function testPublic() { echo "Foo::testPublicn"; }
private function testPrivate() { echo "Foo::testPrivaten"; }}
$myFoo = new foo();$myFoo->test(); // Bar::testPrivate // Foo::testPublic?>