在前面我們知道,在對象外部存取對象成員屬性和方法,使用對象的引用來完成。而在對象內部中,成員方法訪問自己對象中的其它成員屬性或者成員方法,要使用特殊的對象引用"$this->值"的形式來訪問,成員屬於哪個對象,$this引用就代表哪個對象,並且只能在對象的成員方法中使用。
為瞭解決php類和對象中變數與屬性的命名衝突和不確定性問題,引入了”$this”關鍵字來調用當前的對象。
在類中調用當前對象的屬性和方法,必須使用”$this->”關鍵字;$this在建構函式中指該建構函式所建立的新對象;方法內的局部變數不屬於對象,不使用$this關鍵字取值。使用$this關鍵字,我們可以在類中調用對象屬性或者方法。
1、調用變數
執行個體:
| 代碼如下 |
複製代碼 |
<?php class user{ private $n; function __construct(){ $name="Mike"; echo $this->n=$name; } } $p=new user(); ?>
|
2、調用方法
執行個體:
| 代碼如下 |
複製代碼 |
<?php class cal{ public function sum($a,$b){ return $a+$b; } public function prt($a,$c){ return $a*$c; } public function result($a,$b,$c){ $a=$this->sum($a,$b); return $this->prt($a,$c); } } $c=new cal(); echo "(2+3)*10= " .$c->result('2','3','10'); ?> |
我們來看一下下面的例子,$this在做了什嗎?
| 代碼如下 |
複製代碼 |
class Person{ //下面是人的成員屬性 var $name; //人的名子 var $sex; //人的性別 var $age; //人的年齡 //定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值 function __construct($name="", $sex="", $age=""){ $this->name=$name; $this->sex=$sex; $this->age=$age; } //這個人可以說話的方法, 說出自己的屬性 function say() { echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>"; } //對象複製時自動調用的方法, 如果想在複製後改變原對象的內容,需要在__clone()中重寫原本 的屬性和方法 function __clone(){ //$this指的複本p2, 而$that是指向原本p1,這樣就在本方法裡,改變了複本的屬性。 $this->name="我是假的$that->name"; $this->age=30; } } $p1=new Person("張三", "男", 20); $p2=clone $p1; $p1->say(); $p2->say(); ?> |
上例輸出:
執行結果
我的名子叫:張三性別:男我的年齡是:20
我的名子叫:我是假的張三性別:男我的年齡是:30
我們來看一下上面的代碼中$this做了什麼:
1、訪問對象內部的成員,如$this->name
2、訪問對象的其它方法,如在say()方法內部訪問了其之外的$this->run()和$this->eat("apple")方法。
另外還有一點值得注意的是,局部變數和成員屬性可以同名,但作用範圍和訪問方式不一樣,如在eat()方法體內的$name相當於局部變數,其作用範圍只限於eat方法內部,而Person的成員屬性聲明部分的 $name,則相當於全域變數,可以其它方法中使用$this->name的形式訪問。
例
| 代碼如下 |
複製代碼 |
< ?php class UserName { //定義屬性 private $name; //定義建構函式 function __construct( $name ) { $this->name = $name; //這裡已經使用了this指標 } //解構函式 function __destruct(){} //列印使用者名稱成員函數 function printName() { print( $this->name ); //又使用了PHP關鍵字this指標 } } //執行個體化對象 $nameObject = new UserName ( "heiyeluren" ); //執行列印 $nameObject->printName(); //輸出: heiyeluren //第二次執行個體化對象 $nameObject2 = new UserName( "PHP5" ); //執行列印 $nameObject2->printName(); //輸出:PHP5 ?> |