7.特殊的引用“$this”的使用
現在我們知道瞭如何訪問對像中的成員,是通過“對象->成員”的方式訪問的,這是在對象的外
部去訪問對像中成員的形式,那麼如果我想在物件的內部,讓物件裡的方法存取本物件的屬性,或
是物件中的方法去呼叫本物件的其它方法這時我們怎麼辦?因為物件裡面的所有的成員都要用對
象來調用,包括物件的內部成員之間的調用,所以在PHP 裡面給我提供了一個本對象的引用$this,
每個物件裡面都有一個對象的引用$this 來代表這個對象,完成對象內部成員的調用, this 的本意就是
「這個」的意思,上面的實例裡面,我們實例化三個實例對象$P1、$P2、$P3,這三個物件裡面各
自存在一個$this 分別代表物件$p1、$p2、$p3 。
透過上圖我們可以看到,$this 就是物件內部代表這個物件的引用,在物件內部和呼叫本物件的
成員和物件外部呼叫物件的成員所使用的方式是一樣的。
$this->属性$this->name; $this->age; $this->sex; $this->方法$this->say(); $this->run();
修改一下上面的實例,讓每個人都說出自己的名字,性別和年齡:
<?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; }f unction run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); //创建实例对象$p1 $p2=new Person(); //创建实例对象$p2 $p3=new Person(); //创建实例对象$p3 //下面三行是给$p1对象属性赋值 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //下面访问$p1对象中的说话方法 $p1->say(); //下面三行是给$p2对象属性赋值 $p2->name="李四"; $p2->sex="女"; $p2->age=30; //下面访问$p2对象中的说话方法 $p2->say(); //下面三行是给$p3对象属性赋值 $p3->name="王五"; $p3->sex="男"; $p3->age=40; //下面访问$p3对象中的说话方法 $p3->say(); ?>
輸出結果為:
我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40
分析一下這個方法:
p2 和$p3 這三個物件中都有say()這個方法,$this 分別代表這三個對象, 呼叫對應
用run()這個方法也是可以的,在say()這個方法中使用$this->run()的方式來完成呼叫。
8.建構方法與析構方法
大多數類別都有一種稱為建構子的特殊方法。當建立一個物件時,它將自動呼叫建構函數,也
就是使用new 這個關鍵字來實例化物件的時候自動呼叫建構函數。
建構子的宣告與其它所操作的宣告一樣,只是其名稱必須是__construct( )。這是PHP5 的變化,
以前的版本中,構造函數的名稱必須與類名相同,這種在PHP5 中仍然可以用,但現在以經很少有
人用了,這樣做的好處是可以使建構子獨立於類別名,當類別名稱改變時不需要改對應的建構子
名稱了。為了向下相容,如果一個類別中沒有名為__construct( )的方法,PHP 將搜尋一個php4 中的寫
法,與類別名稱相同名的建構方法。
格式:
function say() //这个人可以说话的方法 { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; }
時候賦初值。
function __construct ( [参数] ) { ... ... }
<? //创建一个人类 class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; }/ /这个人的说话方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; } } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?>
與建構子相對的就是析構函數。析構函數是PHP5 新加入的內容,在PHP4 中沒有析構函數。
析構函數允許在銷毀一個類別之前執行的一些操作或完成一些功能,比如說關閉文件,釋放結果集等,
析構函數會在到某個對象的所有引用都被刪除或者當對像被顯式銷毀時執行,也就是物件在記憶體中
被銷毀前呼叫析構函數。與建構子的名稱類似,一個類別的析構函式名稱必須是__destruct( )。析構
函數不能帶有任何參數。
格式:
我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40
function __destruct ( ) { ... ... }
<? //创建一个人类 class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; } //这个人的说话方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; } //这是一个析构函数,在对象销毁前调用 function __destruct() { echo “再见”.$this->name.”<br>”; } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?>