访问类型(public,protected,private)

类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。PHP5支持如下3种访问修饰符:

public (公有的、默认的),protected (受保护的)和private (私有的)三种。

public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员(包括成员属性和成员方法),在PHP5之前的所有版本中,PHP 中类的成员都是public的,而且在PHP5中如果类的成员没有指定成员访问修饰符,将被视为public 。例:

1 public $name;
2 public function say(){ };

private 私有修改符,被定义为private的成员,对于同一个类里的所有成员是可见的,即没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不能访问private修饰的成员。例:

1 private $var1 'A';            // 属性
2 private function getValue(){ }  // 函数
 类内部访问方式为:$this->var1,$this->getValue()

protected保护成员修饰符,被修饰为protected的成员不能被该类的外部代码访问。但是对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的子类都不具有访问其属性和方法的权限。

例:

1 protected $name;
2 protected function say(){ };
 privateprotectedpublic
同一个类中
类的子类中 
所有的外部成员  

属性访问控制示例:

01 <?php
02 /**
03  * Define MyClass
04  */
05 class MyClass
06 {
07     public $public 'Public';
08     protected $protected 'Protected';
09     private $private 'Private';
10  
11     function printHello()
12     {
13         echo $this->public;
14         echo $this->protected;
15         echo $this->private;
16     }
17 }
18  
19 $obj new MyClass();
20 echo $obj->public;       // Works
21 echo $obj->protected;    // Fatal Error
22 echo $obj->private;      // Fatal Error
23 $obj->printHello();      // Shows Public, Protected and Private
24  
25 /**
26  * Define MyClass2
27  */
28 class MyClass2 extends MyClass
29 {
30     // We can redeclare the public and protected method, but not private
31     protected $protected 'Protected2';
32  
33     function printHello()
34     {
35         echo $this->public;
36         echo $this->protected;
37         echo $this->private;
38     }
39 }
40  
41 $obj2 new MyClass2();
42 echo $obj->public;       // Works
43 echo $obj2->private// Undefined
44 echo $obj2->protected;   // Fatal Error
45 $obj2->printHello(); // Shows Public, Protected2, not Private
46 ?>

方法访问控制示例:

01 <?php
02 /**
03  * Define MyClass
04  */
05 class MyClass
06 {
07     // Contructors must be public
08     public function __construct() { }
09  
10     // Declare a public method
11     public function MyPublic() { }
12  
13     // Declare a protected method
14     protected function MyProtected() { }
15  
16     // Declare a private method
17     private function MyPrivate() { }
18  
19     // This is public
20     function Foo()
21     {
22         $this->MyPublic();
23         $this->MyProtected();
24         $this->MyPrivate();
25     }
26 }
27  
28 $myclass new MyClass;
29 $myclass->MyPublic();        // Works
30 $myclass->MyProtected(); // Fatal Error
31 $myclass->MyPrivate();       // Fatal Error
32 $myclass->Foo();         // Public, Protected and Private work
33  
34 /**
35  * Define MyClass2
36  */
37 class MyClass2 extends MyClass
38 {
39     // This is public
40     function Foo2()
41     {
42         $this->MyPublic();
43         $this->MyProtected();
44         $this->MyPrivate();      // Fatal Error
45     }
46 }
47  
48 $myclass2 new MyClass2;
49 $myclass2->MyPublic();   // Works
50 $myclass2->Foo2();       // Public and Protected work, not Private
51 ?>

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protected和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值