最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php設(shè)計(jì)模式介紹之值對象模式第2/5頁

 更新時間:2008年04月13日 22:10:17   作者:  
在所有的最簡單的程序中,大多數(shù)對象都有一個標(biāo)識,一個重要的商業(yè)應(yīng)用對象,例如一個Customer或者一個SKU,有一個或者更多的屬性---id,name,email地址,這樣可以把它從同一個類的其他實(shí)例區(qū)分開來。此外,對象有一個恒定的標(biāo)識:它是貫穿于整個應(yīng)用程序的一個唯一的標(biāo)識,對于程序員來說,”customer A”在任何地方就是”customer A”,并且只要你的程序在持續(xù)運(yùn)行時"customer A"仍然是"customer A"。 但是一個對象不需要有一個標(biāo)識。有些對象僅僅是為了描述其他對象的屬性。

問題:

那么,你該如何為Date或Dollar這樣一些描述簡單的應(yīng)用定義一個高效的類,并且易于創(chuàng)建呢。

解決方案:

高效的對象應(yīng)該像PHP的整型那樣運(yùn)作:如果你把同一個對象資源賦值給兩個不同的變量,然后改變其中的一個變量,另一個變量仍然不受影響。事實(shí)上,這就是Value Object模式的目標(biāo)所在。

執(zhí)行Value Object時,php4和php5是有區(qū)別的。

正如以上你所看到的,PHP5通過new進(jìn)行對象資源的賦值傳遞的是對象資源的指針就像我們在PHP4中通過指針傳遞一樣。很明顯,這是一個問題。為了解決那個問題并實(shí)現(xiàn)一個專有對象Dollar的值,我們必須使屬性$amount的對象的所有屬性的一個值在一般情況下不可變或不能改變。但是在PHP語言的沒有提供參數(shù)不可改變的功能的情況下,你完全可以結(jié)合屬性的可見性與獲得和設(shè)置方法來實(shí)現(xiàn)。

 相反地,PHP4操作所有的對象都是遵循Value Objects對象規(guī)律的,因?yàn)镻HP4的賦值操作相當(dāng)于對對象做了一個拷貝。所以為了在PHP4中實(shí)現(xiàn)Value Objects設(shè)計(jì)模式你需要打破你細(xì)心地培養(yǎng)的通過指針賦值來創(chuàng)建、傳遞、提取對象的習(xí)慣。

注:術(shù)語 不可變的(Immutable):

在詞典中Immutable的定義是不允許或不易受影響。在編程中,這個術(shù)語表示一個一旦被設(shè)置就不能改變的值。

PHP5 樣本代碼:

既然我們開始用PHP5編寫代碼,讓我們優(yōu)化一個PHP5的Value Object的實(shí)例并創(chuàng)建一個較好的Dollar類定義。命名在面向?qū)ο缶幊讨蟹浅V匾x擇一個唯一的貨幣類型作為這個類的名字,說明它不被定義為可以處理多種貨幣類型的類。

class Dollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount;
}
public function getAmount() {
return $this->amount;
}
public function add($dollar) {
return new Dollar($this->amount + $dollar->getAmount());
}
}
類里面的屬性如果加上protected前綴,別的類是訪問不了的。protected(和private)拒絕通過屬性直接被訪問。

通常,當(dāng)你使用面向?qū)ο筮M(jìn)行編程的時候,你經(jīng)常需要創(chuàng)建了一個“setter”函數(shù),就類似于:

public setAmount($amount)
{
  $this->amount=$amount;
}
一樣,在這種情況下,雖然沒有設(shè)定函數(shù)Dollar::amount(),但在對象的實(shí)例化期時,參數(shù)Dollar::amount就已經(jīng)被賦值了。而函數(shù)Dollar::getAmount()只是提供一個訪問Dollar屬性的功能,在這里訪問的數(shù)據(jù)類型為浮點(diǎn)型。

最有趣的變化是在Dollar::add()方法函數(shù)中。并不是直接改變$this->amount變量的值從而會改變已存在的Dollar對象實(shí)例,而是創(chuàng)建并返回一個新的Dollar實(shí)例。現(xiàn)在,盡管你指定當(dāng)前對象給多個變量,但是每一個變量的變化都不會影響其它的變量實(shí)例。

對于價(jià)值設(shè)計(jì)模式不變性是關(guān)鍵,任何對于一個Value Object的變量amount的改變,是通過創(chuàng)建一個新的帶有不同預(yù)期值的類的實(shí)例來完成的。上文中提高的最初那個$this->amount變量的值從未改變。

簡單來說,在PHP5里面使用價(jià)值設(shè)計(jì)模式時,需要注意以下幾個方面:

保護(hù)值對象的屬性,禁止被直接訪問。 
在構(gòu)造函數(shù)中就對屬性進(jìn)行賦值。 
去掉任何一個會改變屬性值的方式函數(shù)(setter),否則屬性值很容易被改變。 
以上三步創(chuàng)建了一個不變的值,這個值一旦被初始化設(shè)置之后就不能被改變。當(dāng)然,你也應(yīng)該提供一個查看函數(shù)或者是訪問Value Object的屬性的方法,并且可以添加一些與這個類相關(guān)的函數(shù)。值對象并不是只能用在一個簡單的架構(gòu)上,它也可以實(shí)現(xiàn)重要的商務(wù)邏輯應(yīng)用。讓我們看看下一個例子:

相關(guān)文章

  • 8個PHP數(shù)組面試題

    8個PHP數(shù)組面試題

    這篇文章主要介紹了8個PHP數(shù)組面試題,例如寫函數(shù)創(chuàng)建長度為10的數(shù)組,數(shù)組中的元素為遞增的奇數(shù),首項(xiàng)為1、創(chuàng)建長度為10的數(shù)組,數(shù)組中的數(shù)為遞增的等比數(shù),比值為3,首項(xiàng)為等題目,需要的朋友可以參考下
    2015-06-06
  • PHP中session使用方法詳解

    PHP中session使用方法詳解

    在PHP開發(fā)中對比起Cookie,session 是存儲在服務(wù)器端的會話,相對安全,并且不像 Cookie 那樣有存儲長度限制,本文簡單介紹 session 的使用
    2007-03-03
  • PHP運(yùn)行SVN命令顯示某用戶的文件更新記錄的代碼

    PHP運(yùn)行SVN命令顯示某用戶的文件更新記錄的代碼

    使用SVN開發(fā)者們平時開發(fā)或代碼上線過程中需要知道某個時間段內(nèi)修改或添加過那些文件,所以用PHP寫了個小程序,直接在瀏覽器中調(diào)用即可
    2014-01-01
  • 淺談PHP中Stream(流)

    淺談PHP中Stream(流)

    Stream是PHP開發(fā)里最容易被忽視的函數(shù)系列(SPL系列,Stream系列,pack函數(shù),封裝協(xié)議)之一,但其是個很有用也很重要的函數(shù)。Stream可以翻譯為“流”,在Java里,流是一個很重要的概念。
    2015-06-06
  • php日志函數(shù)error_log用法實(shí)例分析

    php日志函數(shù)error_log用法實(shí)例分析

    這篇文章主要介紹了php日志函數(shù)error_log用法,結(jié)合實(shí)例形式分析了php日志函數(shù)error_log相關(guān)的配置文件設(shè)置、函數(shù)功能、用法與使用注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 網(wǎng)站用php實(shí)現(xiàn)paypal整合方法

    網(wǎng)站用php實(shí)現(xiàn)paypal整合方法

    雖然在中國paypal不是很流行,但如果把范圍擴(kuò)大到世界的話,那paypal無疑就是老大了。
    2010-11-11
  • 微信公眾號點(diǎn)擊菜單即可打開并登錄微站的實(shí)現(xiàn)方法

    微信公眾號點(diǎn)擊菜單即可打開并登錄微站的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信公眾號點(diǎn)擊菜單即可打開并登錄微站的實(shí)現(xiàn)方法,以實(shí)例形式對回調(diào)、菜單及參數(shù)的處理等具體實(shí)現(xiàn)步驟與功能代碼都做了較為詳細(xì)的描述,對于微信公眾號的開發(fā)來說具有很好的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • php操作sqlserver關(guān)于時間日期讀取的小小見解

    php操作sqlserver關(guān)于時間日期讀取的小小見解

    以前一直在用mysql對sqlserver不是很熟悉,于是摸著石頭過河。沒有別的至少mysql和sqlserver還算是親戚 做條件查詢的時候。出現(xiàn)了問題
    2009-11-11
  • Php獲取金書網(wǎng)的書名的實(shí)現(xiàn)代碼

    Php獲取金書網(wǎng)的書名的實(shí)現(xiàn)代碼

    php獲取金書網(wǎng)的書名的實(shí)現(xiàn)代碼。
    2010-06-06
  • 兼容PHP5的PHP目錄管理函數(shù)庫

    兼容PHP5的PHP目錄管理函數(shù)庫

    php下進(jìn)行目錄的一些操作,經(jīng)常用到的方法
    2008-07-07

最新評論

乐亭县| 宜兰县| 获嘉县| 阳西县| 兴仁县| 儋州市| 清水河县| 宣汉县| 仁怀市| 宁都县| 分宜县| 北安市| 陆川县| 长沙市| 周至县| 东源县| 嵊州市| 融水| 洛南县| 仁怀市| 鸡东县| 县级市| 昆山市| 米脂县| 托克逊县| 鄢陵县| 印江| 太原市| 澳门| 聊城市| 五常市| 兴安盟| 崇礼县| 紫阳县| 东至县| 郸城县| 高青县| 琼海市| 定南县| 青龙| 延安市|