php設計模式介紹之值對象模式(2)_PHP教程

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

      推薦:談PHP程序開發中的中文編碼問題
      PHP程序設計中中文編碼問題曾經困擾很多人,導致這個問題的原因其實很簡單,每個國家(或區域)都規定了計算機信息交換用的字符編碼集,如美國的擴展 ASCII 碼, 中國的 GB2312-80,日本的 JIS 等。作為該國家/區域內信息處理的基礎,字符編碼集起著統一編碼的

      問題:

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

      解決方案:

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

      執行Value Object時,php4和php5是有區別的。

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

      相反地,PHP4操作所有的對象都是遵循Value Objects對象規律的,因為PHP4的賦值操作相當于對對象做了一個拷貝。所以為了在PHP4中實現Value Objects設計模式你需要打破你細心地培養的通過指針賦值來創建、傳遞、提取對象的習慣。

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

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

      PHP5 樣本代碼:

      既然我們開始用PHP5編寫代碼,讓我們優化一個PHP5的Value Object的實例并創建一個較好的Dollar類定義。命名在面向對象編程中非常重要,選擇一個唯一的貨幣類型作為這個類的名字,說明它不被定義為可以處理多種貨幣類型的類。

      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)拒絕通過屬性直接被訪問。

      通常,當你使用面向對象進行編程的時候,你經常需要創建了一個“setter”函數,就類似于:

      public setAmount($amount)

      {

      $this->amount=$amount;

      }
      一樣,在這種情況下,雖然沒有設定函數Dollar::amount(),但在對象的實例化期時,參數Dollar::amount就已經被賦值了。而函數Dollar::getAmount()只是提供一個訪問Dollar屬性的功能,在這里訪問的數據類型為浮點型。

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

      對于價值設計模式不變性是關鍵,任何對于一個Value Object的變量amount的改變,是通過創建一個新的帶有不同預期值的類的實例來完成的。上文中提高的最初那個$this->amount變量的值從未改變。

      簡單來說,在PHP5里面使用價值設計模式時,需要注意以下幾個方面:

      保護值對象的屬性,禁止被直接訪問。

      在構造函數中就對屬性進行賦值。

      去掉任何一個會改變屬性值的方式函數(setter),否則屬性值很容易被改變。

      以上三步創建了一個不變的值,這個值一旦被初始化設置之后就不能被改變。當然,你也應該提供一個查看函數或者是訪問Value Object的屬性的方法,并且可以添加一些與這個類相關的函數。值對象并不是只能用在一個簡單的架構上,它也可以實現重要的商務邏輯應用。讓我們看看下一個例子:

      分享:淺談正確理解PHP程序錯誤信息的表示含義
      簡述:我們編寫程序時,無論怎樣小心謹慎,犯錯總是在所難免的。這些錯誤通常會迷惑PHP編譯器。如果開發人員無法了解編譯器報錯信息的含義,那么這些錯誤信息不僅毫無用處,還會常常讓人感到沮喪。 我們編寫程序時,無論怎樣小心謹慎,犯錯總是在所難免的。

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-18
      相關PHP教程