日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

淺談PHP5 OOP編程之代理與定制異常(1)_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:如何利用PHP操縱Oracle LOB類型數(shù)據(jù)
用過Oracle的人都知道,Oracle有一種數(shù)據(jù)類型叫VARCHAR2,用來表示不定長的字符串。VARCHAR2也是Oracle公司推薦使用的類型。但使用VARCHAR2有個問題:最大只能表示4000個字符,也就相當(dāng)于2000個漢字。如果你的程序中某個字符的值要大于20002個漢字,用VARCHA

一、 DBQuery對象

現(xiàn)在,我們的DBQuery對象簡單地模仿一個存儲過程—一旦被執(zhí)行,即返回一個必須進(jìn)行保存的結(jié)果資源;并且如果你想使用該結(jié)果集上的函數(shù)(例如num_rows()或fetch_row())的話,你必須傳遞MySqlDB對象。那么,如果由DBQuery對象來實現(xiàn)MySqlDB對象(其設(shè)計目的是對一個執(zhí)行查詢的結(jié)果進(jìn)行操作)實現(xiàn)的函數(shù),效果如何呢?讓我們繼續(xù)使用上一篇示例中的代碼;并且讓我們假定,現(xiàn)在由DBQuery對象管理我們的結(jié)果資源。DBQuery類的源碼如列表1所示。

列表1.使用DBQuery類。

require 'mysql_db.php';

require_once 'query.php';

$db = new MySqlDb;

$db->connect('host', 'username', 'pass');

$db->query('use content_management_system');

$query = new DBQuery($db);

$query->prepare('SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3I');

try {

if($query->execute("visualad", "apron", time()))->num_rows() == 1) {

echo('Correct Credentials');

} else {

echo('Incorrect Credentials / Session Expired');

}

} catch (QueryException $e) {

echo('Error executing query: ' . $e);

}

上面修改后的代碼中我們最感興趣的是,catch語句和execute語句。

· execute語句不再返回一個結(jié)果資源,現(xiàn)在它返回DBQuery對象本身。

· DBQuery對象現(xiàn)在實現(xiàn)num_rows()函數(shù)—我們從DB接口中已經(jīng)熟悉。

· 如果查詢執(zhí)行失敗,它拋出一個QueryException類型的異常。當(dāng)被轉(zhuǎn)換成一個字符串時,它將返回發(fā)生的錯誤的細(xì)節(jié)信息。

為此,你需要使用代理。事實上,你在我們的DBQuery對象中已經(jīng)使用代理了,但是現(xiàn)在將更為深入地使用它來把它與MySqlDB對象緊密綁定。該DBQuery對象已經(jīng)被使用一個實現(xiàn)DB接口的對象初始化,并且它已經(jīng)包含一個成員函數(shù)execute—由它調(diào)用DB對象的query()方法來執(zhí)行該查詢。這個DBQuery對象本身并不實際地查詢數(shù)據(jù)庫,它把這項任務(wù)交由DB對象來完成。這就是代理,其實是一個進(jìn)程—借助于這個進(jìn)程,通過把消息發(fā)送給另一個實現(xiàn)相同的或類似行為的對象,一個對象可以實現(xiàn)一個特別的行為。

  為此,你需要修改DBQuery對象以便包括所有的函數(shù)—它們操作一個來自DB對象的結(jié)果資源。當(dāng)執(zhí)行查詢以調(diào)用DB對象的相應(yīng)函數(shù)并且返回它的結(jié)果時,你需要使用存儲的結(jié)果。下列函數(shù)將被添加:

列表2:使用代理擴(kuò)展DBQuery類。

class DBQuery

{

.....

public function fetch_array()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_array($this->result);

}

public function fetch_row()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_row($this->result);

}

public function fetch_assoc()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}
return $this->db->fetch_assoc($this->result);

}

public function fetch_object()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_object($this->result);

}

public function num_rows()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->num_rows($this->result);

}

}

每個函數(shù)的實現(xiàn)相當(dāng)簡單。它首先進(jìn)行檢查,以確保已經(jīng)執(zhí)行查詢,然后把任務(wù)代理到DB對象,返回它的結(jié)果就好象它是查詢對象本身(稱作是基本數(shù)據(jù)庫函數(shù))一樣。

二、 類型提示(Type Hinting)

為了使代理能夠工作,我們需要確保DBQuery對象的$db變量是一個實現(xiàn)了DB接口的對象的實例。類型提示是PHP 5中的一種新特征,它能夠使你把函數(shù)參數(shù)強(qiáng)制轉(zhuǎn)換成特定類型的對象。在PHP 5之前,唯一的確保函數(shù)參數(shù)是一個特定對象類型的方法是使用PHP中所提供的類型檢查函數(shù)(也即是is_a())�,F(xiàn)在,你可以簡單地強(qiáng)制轉(zhuǎn)換對象類型—通過在函數(shù)參數(shù)的前面加上類型名。你已經(jīng)從我們的DBQuery對象中看到了類型提示,這樣可以確保一個實現(xiàn)DB接口的對象被傳遞到對象構(gòu)造器中。

public function __construct(DB $db)

{

$this->db = $db;

}

當(dāng)使用類型提示時,你不僅可以指定對象類型,還可以指定抽象類和接口。

分享:怎樣成為PHP高手
PHP是一門高效的網(wǎng)絡(luò)編程語言,由于它具有編寫靈活、運行快速等優(yōu)點,迅速成為Web程序員的首選語言。前不久的一份權(quán)威調(diào)查表明,現(xiàn)在已經(jīng)有31.6%的網(wǎng)站使用PHP作為主要的服務(wù)器端編程語言。 但是,要成為一名PHP編程高手卻并不容易。并不像很多人想象的那樣

來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-20
相關(guān)PHP教程