與大多數(shù)可以面向?qū)ο蟮木幊陶Z言不一樣, PHP 是同時支持面向過程和面向?qū)ο蟮木幊谭绞剑?PHP 開發(fā)者可以在面向過程和面向?qū)ο蠖咧凶杂蛇x擇其一或是混合使用,不過由于在 PHP5 之前的版本中, PHP 主要還是面向過程的編程語言,因此大多時候 PHP 開發(fā)者應(yīng)該還是選擇面向過程的方式進行開發(fā),事實上, Kayo 認為即使一個 PHP 開發(fā)者完全不使用面向?qū)ο?,他也能開發(fā)出很出色的 PHP 程序,我們可以想象, Web 頁面的解析本身就很過程化,在 HTML 中嵌入面向過程處理的代碼是非常自然的手段,因此不能說面向?qū)ο笫且环N比面向過程更加優(yōu)秀的編程方式,只是另一種編程選擇,當(dāng)然這里說的是 PHP 中的情況。
對于 PHP 中面向過程和面向?qū)ο蟾髯缘膬?yōu)缺點,相信在網(wǎng)上稍查一下就會很清楚了,面向過程開發(fā)周期短,發(fā)布快,效率較高,面向?qū)ο箝_發(fā)周期長,效率較低但易于維護,改進,擴展和開發(fā) API 。顯然易見,我們很難說哪一個方式會更優(yōu)秀,與其爭論哪一種編程方式更優(yōu)秀,不如盡量發(fā)揮出兩種編程方式各自的優(yōu)勢。
回到 PHP 的面向?qū)ο缶幊?,在使用面向?qū)ο蟮倪^程中還是很容易就感受到它的優(yōu)勢,最明顯的地方是代碼功能更加清晰,數(shù)據(jù)處理,用戶登陸,內(nèi)容呈現(xiàn)等各寫成一個類,在頁面中只需包含這些類、實例化對象,然后再用簡潔的語句應(yīng)用對象就行,這與面向過程中把數(shù)據(jù)處理,用戶登陸,還有內(nèi)容等部分寫在一起相比,前者的編程思路肯定更加清晰和易于理解,相信團隊開發(fā)中應(yīng)該更為偏向于面向?qū)ο缶幊獭?/P>
下面舉一個簡單的例子說明一下面向過程和面向?qū)ο髢煞N方式各自的優(yōu)缺點
在處理表單或接受 url 參數(shù)時,為了防止 SQL 注入等問題, PHP 開發(fā)者常常需要過濾字符串。
在面向過程的方式中,我們會在需要過濾字符串的語句中調(diào)用各種過濾字符串的庫函數(shù)或自定義函數(shù),這樣下來,頁面中就會出現(xiàn)很多不同的過濾函數(shù)甚至還有復(fù)雜的正則表達式,即使在頁面中寫了足夠的注釋難免還是比較混亂,下面看看面向?qū)ο蟮奶幚矸绞健?/P>
首先是定義了一個簡單的處理字符串的類,把各種復(fù)雜的字符串處理寫成方法(關(guān)于 PHP 面向?qū)ο蟮闹R可以 Google ,本文不另外敘述。)
<?php
/* 字符串處理類
* 參數(shù)$length用作判斷字符串是否超過指定長度
* 轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符
* 正則限制字符串內(nèi)只能為數(shù)字
* 判斷字符串是否為空
* 判斷字符串長度
*/
// 創(chuàng)建字符串處理類
class StringFiltration {
// 屬性
var $length;
// 方法
// 構(gòu)造方法
function __construct($the_length = NULL){
$this->length = $the_length;
}
// 轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符
function realEscapeString($the_string){
return mysql_real_escape_string($the_string);
}
// 正則限制字符串內(nèi)只能為數(shù)字
function eregNumber($the_string){
if( ereg("^[0-9]+$",$the_string) )
return true;
else
return false;
}
// 判斷字符串是否為空
function strlenString($the_string){
return strlen($the_string);
}
// 判斷字符串長度
function ifOverStrlenLength($the_string){
if( strlen($the_string) > $this->length )
return true;
else
return false;
}
}
?>
然后在需要過濾字符串的頁面中實例化該類。
$string = new StringFiltration();
接著在過濾或判斷字符串時調(diào)用類中定義好的方法,于是頁面中會出現(xiàn)一些調(diào)用方法的語句。
$email = $string->realEscapeString($_POST['email']);
$postId = $string->eregNumber($id);
在上面的例子中,我們可以看到,在面向?qū)ο筇幚碜址?,我們必須定義一個類,然后再在需要的頁面中實例化這個類并調(diào)用這個類中的方法,這里看來,面向?qū)ο蟮男氏啾让嫦蜻^程是低了,而且也很麻煩,不過這樣的優(yōu)勢也很明顯,實際處理或判斷字符串的語句都寫在類的內(nèi)部,在調(diào)用方法的頁面并不會出現(xiàn)各種復(fù)雜的自定義函數(shù)和諸如正則表達式這樣復(fù)雜的語句,頁面的結(jié)構(gòu)乃至整個網(wǎng)站的結(jié)構(gòu)更加清晰了,并且在寫好一個類后,日后進行 PHP 開發(fā)時都可以再使用這個類,從長遠來看效率反而高了。因此一直都在進行 PHP 面向過程編程的開發(fā)者不妨換種思路,試試面向?qū)ο蟆?/P>