国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP5中的this,self和parent關鍵字詳解

2024-05-04 21:52:20
字體:
來源:轉載
供稿:網友

PHP5是一具備了大部分面向對象語言的特性的語言,比PHP4有了很多的面向對象的特性,但是有部分概念也比較繞人,所以今天拿出來說說,說的不好,請高手見諒. (閱讀本文,需要了解PHP5的面向對象的知識)

首先我們來明白上面三個關鍵字: this,self,parent,從字面上比較好理解,是指這,自己,父親,呵呵,比較好玩了,我們先建立幾個概念,這三個關鍵字分別是用在什么地方呢?我們初步解釋一下,this是指向當前對象的指針(我們姑且用C里面的指針來看吧),self是指向當前類的指針,parent是指向父類的指針。我們這里頻繁使用指針來描述,是因為沒有更好的語言來表達,呵呵,語文沒學好。

這么說還不能很了解,那我們就根據實際的例子結合來講講。

以下為引用的內容:

(1) this

1 <?php
2
3 class UserName
4 {
5 //定義屬性
6 private name;
7
8 //定義構造函數
9 function __construct( name )
10 {
11 this->name = name; //這里已經使用了this指針
12 }
13
14 //析構函數
15 function __destruct(){}
16
17 //打印用戶名成員函數
18 function printName()
19 {
20 print( this->name ); //又使用了this指針
21 }
22 }
23
24 //實例化對象
25 nameObject = new UserName( "heiyeluren" );
26
27 //執行打印
28 nameObject->printName(); //輸出: heiyeluren
29
30 //第二次實例化對象
31 nameObject2 = new UserName( "PHP5" );
32
33 //執行打印
34 nameObject2->printName(); //輸出:PHP5
35 ?>

我們看,上面的類分別在11行和20行使用了this指針,那么當時this是指向誰呢?其實this是在實例化的時候來確定指向誰,比如第一次實例化對象的時候(25行),那么當時this就是指向nameObject對象,那么執行18行的打印的時候就把print( this-><name )變成了print( nameObject->name ),那么當然就輸出了"heiyeluren"。第二個實例的時候,print( this->name )變成了print( nameObject2->name ),于是就輸出了"PHP5"。所以說,this就是指向當前對象實例的指針,不指向任何其他對象或類。

(2)self

首先我們要明確一點,self是指向類本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類中的靜態變量。

以下為引用的內容:

1 <?php
2
3 class Counter
4 {
5 //定義屬性,包括一個靜態變量
6 private static firstCount = 0;
7 private lastCount;
8
9 //構造函數
10 function __construct()
11 {
12 this->lastCount = selft::firstCount; //使用self來調用靜態變量,使用self調用必須使用::(域運算符號)
13 }
14
15 //打印最次數值
16 function printLastCount()
17 {
18 print( this->lastCount );
19 }
20 }
21
22 //實例化對象
23 countObject = new Counter();
24
25 countObject->printLastCount(); //輸出 1
26
27 ?>

我們這里只要注意兩個地方,第6行和第12行。我們在第二行定義了一個靜態變量firstCount,并且初始值為0,那么在12行的時候調用了這個值得,使用的是self來調用,并且中間使用"::"來連接,就是我們所謂的域運算符,那么這時候我們調用的就是類自己定義的靜態變量frestCount,我們的靜態變量與下面對象的實例無關,它只是跟類有關,那么我調用類本身的的,那么我們就無法使用this來引用,可以使用self來引用,因為self是指向類本身,與任何對象實例無關。換句話說,假如我們的類里面靜態的成員,我們也必須使用self來調用。

(3)parent

我們知道parent是指向父類的指針,一般我們使用parent來調用父類的構造函數。

以下為引用的內容:

1 <?php
2
3 //基類
4 class Animal
5 {
6 //基類的屬性
7 public name; //名字
8
9 //基類的構造函數
10 public function __construct( name )
11 {
12 this->name = name;
13 }
14 }
15
16 //派生類
17 class Person extends Animal //Person類繼承了Animal類
18 {
19 public personSex; //性別
20 public personAge; //年齡
21
22 //繼承類的構造函數
23 function __construct( personSex, personAge )
24 {
25 parent::__construct( "heiyeluren" ); //使用parent調用了父類的構造函數
26 this->personSex = personSex;
27 this->personAge = personAge;
28 }
29
30 function printPerson()
31 {
32 print( this->name. " is " .this->personSex. ",this year " .this->personAge );
33 }
34 }
35
36 //實例化Person對象
37 personObject = new Person( "male", "21");
38
39 //執行打印
40 personObject->printPerson(); //輸出:heiyeluren is male,this year 21
41
42 ?>

我們注意這么幾個細節:成員屬性都是public的,特別是父類的,是為了供繼承類通過this來訪問。我們注意關鍵的地方,第25行:parent::__construct( "heiyeluren" ),這時候我們就使用parent來調用父類的構造函數進行對父類的初始化,因為父類的成員都是public的,于是我們就能夠在繼承類中直接使用this來調用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁山县| 兰州市| 沈阳市| 七台河市| 林口县| 庆阳市| 石城县| 汉阴县| 阳高县| 都兰县| 长治市| 丘北县| 郓城县| 乐清市| 卢湾区| 炉霍县| 广宁县| 南郑县| 郸城县| 涞水县| 沐川县| 漠河县| 桦川县| 武川县| 安陆市| 万源市| 九龙县| 岑溪市| 环江| 广平县| 皮山县| 西安市| 岳阳市| 邵阳市| 丽水市| 酉阳| 阿克陶县| 拜泉县| 南汇区| 昌平区| 安丘市|