淺談PHP5 OOP編程之代理與定制異常(1)_PHP教程
推薦:如何利用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編程高手卻并不容易。并不像很多人想象的那樣
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- 解析20款 Web Mail PHP開源項(xiàng)目
- 解析PHP連接遠(yuǎn)程MYSQL和MYSQL5.1中文亂碼處理方法
- PHP教程:五個(gè)使用PHP制作動(dòng)態(tài)網(wǎng)頁的技巧
- php拾遺
- 用PHP提取中英文詞語以及數(shù)字的首字母的方法介紹
- 用動(dòng)態(tài)網(wǎng)頁技術(shù)PHP打造個(gè)人網(wǎng)站全攻略
- PHP utf-8編碼問題,utf8編碼,數(shù)據(jù)庫亂碼,頁面顯示輸出亂碼
- 解析php字符串處理函數(shù)
- input file獲得文件根目錄簡(jiǎn)單實(shí)現(xiàn)
- PHP安全之Register Globals
- 相關(guān)鏈接:
- 教程說明:
PHP教程-淺談PHP5 OOP編程之代理與定制異常(1)
。