類型的訪問修飾符允許開發人員對類成員的訪問進行限制,這是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(){ };
~~~
| | private | protected | public |
| -- | -- | -- | -- |
| 同一個類中 | √ | √ | √ |
| 類的子類中 | | √ | √ |
| 所有的外部成員 | | | √ |
屬性訪問控制示例:
~~~
1 <?php
2 /**
3 * Define MyClass
4 */
5 class MyClass
6 {
7 public $public = 'Public';
8 protected $protected = 'Protected';
9 private $private = 'Private';
10
11 function printHello() {
12 echo $this->public;
13 echo $this->protected;
14 echo $this->private;
15 }
16 }
17
18 $obj = new MyClass();
19 echo $obj->public; // Works
20 echo $obj->protected; // Fatal Error
21 echo $obj->private; // Fatal Error
22 $obj->printHello(); // Shows Public, Protected and Private
23
24 /**
25 * Define MyClass2
26 */
27 class MyClass2 extends MyClass
28 {
29 // We can redeclare the public and protected method, but not private
30 protected $protected = 'Protected2';
31
32 function printHello() {
33 echo $this->public;
34 echo $this->protected;
35 echo $this->private;
36 }
37 }
38
39 $obj2 = new MyClass2();
40 echo $obj->public; // Works
41 echo $obj2->private; // Undefined
42 echo $obj2->protected; // Fatal Error
43 $obj2->printHello(); // Shows Public, Protected2, not Private
44 ?>
~~~
方法訪問控制示例:
~~~
1 <?php
2 /**
3 * Define MyClass
4 */
5 class MyClass
6 {
7 // Contructors must be public
8 public function __construct() { }
9
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 $this->MyPublic();
22 $this->MyProtected();
23 $this->MyPrivate();
24 }
25 }
26
27 $myclass = new MyClass;
28 $myclass->MyPublic(); // Works
29 $myclass->MyProtected(); // Fatal Error
30 $myclass->MyPrivate(); // Fatal Error
31 $myclass->Foo(); // Public, Protected and Private work
32
33 /**
34 * Define MyClass2
35 */
36 class MyClass2 extends MyClass
37 {
38 // This is public
39 function Foo2() {
40 $this->MyPublic();
41 $this->MyProtected();
42 $this->MyPrivate(); // Fatal Error
43 }
44 }
45
46 $myclass2 = new MyClass2;
47 $myclass2->MyPublic(); // Works
48 $myclass2->Foo2(); // Public and Protected work, not Private
49 ?>
~~~
另外在子類覆蓋父類的方法時也要注意一點,子類中方法的訪問權限一定不能低于父類被覆蓋方法的訪問權限,也就是一定要高于或等于父類方法的訪問權限。
例如,如果父類方法的訪問權限是protected,那么子類中要覆蓋的權限就要是protected和public,如果父類的方法是public那么子類中要覆蓋的方法只能也是public,總之子類中的方法總是要高于或等于父類被覆蓋方法的訪問權限。
- 1.什么是面向對象
- 2.什么是類,什么是對象,類和對象這間的關系
- 3.什么是面向對象編程呢
- 4.如何抽象出一個類
- 5.如何實例化對象
- 6.如何去使用對象中的成員
- 7.特殊的引用this的使用
- 8.構造方法__construct()與析構方法__destruct()
- 9.封裝性(var與public,protected,private的關系)
- 10.__set(),__get(),__isset(),__unset()四個方法的應用
- 11.類的繼承
- 12.重載新的方法(parent::)
- 13.訪問類型(public,protected,private)
- 14.final關鍵字的應用
- 15.static和const關鍵字的使用(self::)
- 16.__toString()方法
- 17.克隆對象__clone()方法
- 18.__call()處理調用錯誤
- 19.抽象方法和抽象類(abstract)
- 20.PHP5接口技術(interface)
- 21.多態的應用
- 22.把對象串行化serialize()方法,__sleep()方法,__wakeup()方法
- 23.自動加載類 __autoload()函數