php面向對象教程4

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
分析一下這個方法:
function say() //這個人可以說話的方法
{
echo "我的名字叫:".$this->name." 性別:".$this->sex." 我的年齡是:
".$this->age."<br>";
}
在$p1、$p2 和$p3 這三個對象中都有say()這個方法,$this 分別代表這三個對象, 調用相應
的屬性,打印出屬性的值,這就是在對象內部訪問對象屬性的方式, 如果相在say()這個方法裏調
用run()這個方法也是可以的,在say()這個方法中使用$this->run()的方式來完成調用。
8.構造方法與析構方法
大多數類都有一種稱爲構造函數的特殊方法。當創建一個對象時,它將自動調用構造函數,也
就是使用new 這個關鍵字來實例化對象的時候自動調用構造方法。
構造函數的聲明與其它操作的聲明一樣,只是其名稱必須是__construct( )。這是PHP5 中的變化,
以前的版本中,構造函數的名稱必須與類名相同,這種在PHP5 中仍然可以用,但現在以經很少有
人用了,這樣做的好處是可以使構造函數獨立於類名,當類名發生改變時不需要改相應的構造函數
名稱了。爲了向下兼容,如果一個類中沒有名爲__construct( )的方法,PHP 將搜索一個php4 中的寫
法,與類名相同名的構造方法。
格式: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();
?>
輸出結果爲:
我的名字叫:張三性別:男我的年齡是:20
我的名字叫:李四性別:女我的年齡是:30
我的名字叫:王五性別:男我的年齡是:40
如圖:
析構函數:
與構造函數相對的就是析構函數。析構函數是PHP5 新添加的內容,在PHP4 中沒有析構函數。
析構函數允許在銷燬一個類之前執行的一些操作或完成一些功能,比如說關閉文件,釋放結果集等,
析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷燬時執行,也就是對象在內存中
被銷燬前調用析構函數。與構造函數的名稱類似,一個類的析構函數名稱必須是__destruct( )。析構
函數不能帶有任何參數。
格式: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();
?>
輸出結果爲:
我的名字叫:張三性別:男我的年齡是:20
我的名字叫:李四性別:女我的年齡是:30
我的名字叫:王五性別:男我的年齡是:40
再見張三
再見李四
再見王五
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章