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

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

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

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

一、 DBQuery對(duì)象

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

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

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

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

  為此,你需要修改DBQuery對(duì)象以便包括所有的函數(shù)—它們操作一個(gè)來自DB對(duì)象的結(jié)果資源。當(dāng)執(zhí)行查詢以調(diào)用DB對(duì)象的相應(yīng)函數(shù)并且返回它的結(jié)果時(shí),你需要使用存儲(chǔ)的結(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);

}

}

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

二、 類型提示(Type Hinting)

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

public function __construct(DB $db)

{

$this->db = $db;

}

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

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

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