避免OOP的形式,POP的思想
好久沒發技術性文章了,今天在21PHP裡看到有位兄弟發了這貼子,轉了過來.對加強OOP的學習有些用
----------------------------------------------------------
避免OOP的形式,POP的思想
隨著PHP對OOP(面向對象編程)支持的增強以及程序設計思想的發展,越來越多的PHP程序員走進了OOP的世界.通過簡單的學習,大多數程序員都能
快速的掌握OOP編程的基本技能.程序員們所寫的代碼裡class,new等字符串也越來越多.但是作為程序員的你,是否陷入了一種OO形式,PO思想的
編程陷阱呢?
作為POP時代的程序員,為了實現計算一件房子的所有門的價格,他們會寫這樣一個函數.
代碼:
/******************************************
函數:priceOfHouseDoor($num,$price)
功能:計算所有的門的價格總和
參數:$num 門的數量,$price 每扇門的價格
備注:surfchen @ http://www.yubeinet.com/
******************************************/
function priceHouseDoor($num,$price)
{
return $num*$price;
}
echo priceHouseDoor(2,5);//輸出價格
或者干脆來個更過程的:
代碼:
$doors=2;//門數量
$price=5;//每扇門的價格
echo $doors*$price;//輸出價格
這是典型的POP.當了解了OOP後,很多人可能會改變實現這個功能的代碼.或許,程序員們會這麼寫:
代碼:
class house
{
/******************************************
函數:getDoorPrice($num,$price)
功能:計算所有的門的價格總和
參數:$num 門的數量,$price 每扇門的價格
備注:surfchen @ http://www.yubeinet.com/
******************************************/
function getDoorPrice($num,$price)
{
return $num*$price;
}
}
$house=new house;
echo $house->getDoorPrice(2,5);//輸出價格
我們一下子就看出來,這段代碼用到了OOP的代表 -- 類和實例化.那麼,這就是面向對象編程了嗎?
我再仔細一看,發現這個類其實只不過是上面的priceOfHouseDoor($num,$price)函數的面向對象形式.
嗯,現在我們先探討一下到底什麼才叫面向對象編程.我的理解是:面向對象編程有兩個核心內容.一是類,二是實例.類是對一類事物的抽象,而實
例是這一類事物中的個體.而實例的屬性(值)和方法(函數),則分別是這個個體的具體內容和動作.
我們再來看看上面的這個house類.它有一個方法,getDoorPrice($num,$price),引入了兩個參數.一個是房子的門的數量,一個是房子門價.我們
發現,當我們使用這個方法時,這兩個值是臨時構建的,並沒有與房子形成任何的聯系.在實際生活中,一個房子裡的門與房子無任何聯系,這是不
可以理解的...正如我們所知道的,OOP其實是我們真實世界的一個縮影.所以,OOP中的房子和房子的門無任何聯系,也是不可理解的,是非OO的思
維.
那麼,我們應該如何使用真正的OO來實現以上功能呢?請看以下代碼:
代碼:
class house
{
var $doors;//門的數量
var $pricePerDoors;//每扇門的價格
function setNumOfDoors($num){$this->doors=$num;}//設定門數量
function setPricePerDoor($price){$this->pricePerDoors=$price;}//設定每扇門的價格
/*************
*獲得門的價格 *
*************/
function getDoorPrice()
{
return ($this->doors)*($this->pricePerDoors);
}
}
$house=new house;
$house->setNumOfDoors(2);//設定門數量
$house->setPricePerDoor(5);//設定每扇門的價格
echo $house->getDoorPrice();//輸出
我們很明顯地看到,以上代碼的門的數量和價格房子已經結合在了一起.這才是真正的面向對象.
你不覺得嗎?^_^