对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
一、属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
- <?php
- 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 ; // 这行能被正常执行 Public
- echo $obj ->protected ;
- // 这行会产生一个致命错误:Fatal error: Cannot access protected property MyClass::$protected
- echo $obj ->private ;
- // 这行也会产生一个致命错误:Fatal error: Cannot access protected property MyClass::$protected
- $obj -> printHello (); //去掉上面两行;则会输出 Public Public、Protected 和 Private
二、方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
- <?php
- 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 (); // 公有,受保护,私有都可以执行
三、其它对象的访问控制
同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
- <?php
- class Test
- {
- private $foo ;
- public function __construct ( $foo )
- {
- $this -> foo = $foo ;
- }
- private function bar ()
- {
- echo '访问私有方法。' ;
- }
- public function baz ( Test $other )
- {
- // 改变私有变量
- $other -> foo = 'hello' ;
- var_dump ( $other -> foo );
- // 调用私有方法
- $other -> bar ();
- }
- }
- $test = new Test ( 'test' );
- $test -> baz (new Test ( 'other' ));//string(5) "hello" 访问私有方法。
public:类的内部,外部都允许访问;允许子类继承,允许子类修改;
protected:类的内部允许访问,外部不允许访问;允许子类继承,允许子类修改;
private:类的内部允许访问,外部不允许访问;不允许子类继承,不允许子类修改;