<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                >空對象模式(Null Object Pattern):用一個空對象取代 NULL,減少對實例的檢查。這樣的空對象可以在數據不可用的時候提供默認的行為 ## (一)為什么需要空對象模式 解決在需要一個對象時返回一個null值,使其調用函數出錯的情況 ## (二)空對象模式UML圖 上圖是Java的空對象模式UML圖,網上很多PHP設計模式的代碼實現都是照著上面這個UML圖 實際上PHP在空對象模式的實現上比Java更加簡單些。因為PHP有美妙的語法糖,魔術方法__call方法。 我們只要實現空對象的__call方法就可以實現空對象模式,并不需要使用nullobject去繼承對應的抽象object。 ## (三)簡單實例 假設現在我們有這么一段代碼 <?php //測試類 class Person{ public function code(){ echo 'code makes me happy'.PHP_EOL; } } //定義一個生成對象函數,只有PHPer才允許生成對象 function getPerson($name){ if($name=='PHPer'){ return new Person; } } $phper = getPerson('PHPer'); $phper->code(); 是的,現在這段代碼會輸出code makes me happy。如果有時候這個函數是別人調用的,它并沒傳入合適的參數呢? $phper = getPerson('Javaer'); $phper->code(); 這個時候就會報錯了error : Call to a member function code() on null。是的$phper現在是一個null值,所以調用code方法就會報錯 這種情況很常見,系統并沒有返回一個我們期待的對象,而是返回了一個null值。所以多數情況下,我們的代碼都要這樣寫 $phper = getPerson('Javaer'); if(!is_null($phper)){ $phper->code(); } 或者是 if(is_object($phper)){ $phper->code(); } 這樣讓太多的if判斷不可避免地存在于我們的代碼中 如果我們使用NullObject模式的話,我們就可以讓函數沒有返回值時返回一個nullobject對象。而不是一個null值(沒有return 默認null值) //測試類 class Person{ public function code(){ echo 'code makes me happy'.PHP_EOL; } } //空對象模式 class NullObject{} //定義一個生成對象函數,只有PHPer才允許生成對象 function getPerson($name){ if($name=='PHPer'){ return new Person; }else{ return new NullObject; } } $phper = getPerson('PHer'); $phper->code(); 這個時候就不會再報一個null調用函數的錯誤了,但是會報一個call to undefined method的錯誤,這是由于NullObject對象沒有code方法。這個時候我們只需實現魔術方法__call,就不會報錯了。 //空對象模式 class NullObject{ public function __call($method,$arg){ echo 'this is NullObject'; } } 我們可以通過返回一個NullObject對象來取代返回null,這樣就不用在調用方法時判斷是否為null,而且只要你實現了call方法,不管真正的對象它原來是調用那個方法的,NullObject都可以去調用而且不報錯(`實際是隱式調用了魔術方法call`)。當然,如果你原本的邏輯是返回對象是null的話什么都不做,那么你可以讓__call()什么都不做。或者你也可以讓它拋出一個異常。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看