<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>

                >單例模式(Singleton Pattern):顧名思義,就是只有一個實例。作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。 ## (一)為什么要使用PHP單例模式 1,php的應用主要在于數據庫應用, 一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少數據庫連接這樣就不容易出現 too many connections情況。 2,如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。 3,在一次頁面請求中, 便于進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日志,從而避免到處var_dump, echo ## (二)單例模式結構圖 ![](https://box.kancloud.cn/d6112b7e786a2fb5fa7ec8cf19b8b57f_438x144.png) ## (三)單例模式的實現 1,私有化一個屬性用于存放唯一的一個實例 2,私有化構造方法,私有化克隆方法,用來創建并只允許創建一個實例 3,公有化靜態方法,用于向系統提供這個實例 ## (四)代碼實現 class Singleton{ //存放實例 private static $_instance = null; //私有化構造方法、 private function __construct(){ echo "單例模式的實例被構造了"; } //私有化克隆方法 private function __clone(){ } //公有化獲取實例方法 public static function getInstance(){ if (!(self::$_instance instanceof Singleton)){ self::$_instance = new Singleton(); } return self::$_instance; } } $singleton=Singleton::getInstance(); #### 優點 因為靜態方法可以在全局范圍內被訪問,當我們需要一個單例模式的對象時,只需調用getInstance方法,獲取先前實例化的對象,無需重新實例化。 ## (五)使用Trait關鍵字實現類似于繼承單例類的功能 Trait Singleton{ //存放實例 private static $_instance = null; //私有化克隆方法 private function __clone(){ } //公有化獲取實例方法 public static function getInstance(){ $class = __CLASS__; if (!(self::$_instance instanceof $class)){ self::$_instance = new $class(); } return self::$_instance; } } class DB { private function __construct(){ echo __CLASS__.PHP_EOL; } } class DBhandle extends DB { use Singleton; private function __construct(){ echo "單例模式的實例被構造了"; } } $handle=DBhandle::getInstance(); //注意若父類方法為public,則子類只能為pubic,若父類為private,子類為public ,protected,private都可以。 補充,大多數書籍介紹單例模式,都會講三私一公,公有化靜態方法作為提供對象的接口,私有屬性用于存放唯一一個單例對象。私有化構造方法,私有化克隆方法保證只存在一個單例。 但實際上,雖然我們無法通過new 關鍵字和clone出一個新的對象,但我們若想得到一個新對象。還是有辦法的,那就是通過序列化和反序列化得到一個對象。私有化sleep()和wakeup()方法依然無法阻止通過這種方法得到一個新對象。或許真得要阻止,你只能去__wakeup添加刪除一個實例的代碼,保證反序列化增加一個對象,你就刪除一個。不過這樣貌似有點怪異。
                  <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>

                              哎呀哎呀视频在线观看