首頁 後端開發 php教程 php 設計模式(轉載)

php 設計模式(轉載)

Jul 30, 2016 pm 01:30 PM
class function nbsp public

原文連結:http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html

1.單例模式

實例。

作為物件的建立模式, 單例模式確保某一個類別只有一個實例,而且自行實例化並向整個系統提供這個實例。

單例模式的要點有三個:

一是某個類別只能有一個實例;
  1. 二是它必須自行建立這個實例;
  2. 自行向整個系統提供這個實例。
  3. 為什麼要使用PHP單例模式

1. php的應用主要在於

    資料庫應用
  1. , 一個應用程式中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少資料庫連接這樣就不容易出現too many connections情況。 2. 如果系統中需要有
  2. 一個類別來全域控制某些設定資訊
  3. , 那麼使用單例模式可以很方便的實作. 這個可以參考zend Framework的FrontController部分。 3. 在一次頁面請求中, 
  4. 便於進行調試
  5. , 因為所有的程式碼(例如資料庫操作類別db)都集中在一個類別中, 我們可以在類別中設定鉤子, 輸出日誌,從而避免到處var_dump, echo。

 範例:

/**
 * 設計模式之單例模式
 * $_instance必須宣告為靜態的私有變數
 * 建構子必須宣告為私人()方法必須設定為公有的,必須呼叫此方法以傳回實例的一個引用
 * ::運算子只能存取靜態變數和靜態函數
 * new物件都會消耗記憶體
 * 使用場景:最常用的地方是資料庫連線。
 * 使用單例模式產生一個物件後,該物件可以被其它眾多物件所使用。
 
*/
class man{
    
// ;    //建構子宣告為private,防止直接建立物件    private 
function __construct()    {     ';    }    //單例方法
    
public static      
var_dump
(isset(self::$_instance));               if(!isset(self::$_instance
))
        {               }        return self::$_instance;
}
    //阻止使用者複製物件實例    private function __clone()
   not allow' ,
E_USER_ERROR);    }    function
 test()
   function test()           
echo
("test");    }}/// ample類別的單例物件

$test = man::get_instance();$test = man::get_instance();

$test->test();();
$test->test();
一個E_USER_ERROR.//$test_clone = clone $test;




2。類別中實作
②繼承自抽象基底類別的子類別:實作基底類別中的抽象方法
③工廠類別:用以實例化所有相對應的子類別
③工廠類別:以實例化所有相對應的子類別

php 設計模式(轉載)

  •     
        /**
         * 
         * 
    */
         abstract 
    class Operation{         //         
    //無法包含函數體         abstract public function getValue(/$num1,function getValue(/$num1,function getValue(/$num1🜎    }               
         
    /*

    *      * 加法類      
    */
              public 
    function getValue($num1,$num2
    ){    +$num2;         }     }     
    */     class OperationSub extends Operation {
      
    ,
    $num2){             return
     
    $num1🎠 }
         /*
    *      * 乘法類別       Operation {         
    public function getValue($num1🠎 turn $num1*$num2
    ;         }     } 除法類別      */
         
    class
     OperationDiv ext function getValue($num1
    ,
    $num2
    ){              (
    $ num2==0){                     throw 
             }else {                                  }             } catch (Exception 
    $e){                           }         }     }





    透過採用物件導向的繼承特性,我們可以很容易就能對原有程式進行擴展,例如:'乘方','開方','對數','三角函數','統計'等,以還可以避免載入沒有必要的程式碼。

    如果我們現在需要增加一個求餘的類,會非常的簡單

    我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大幅降低了耦合度,方便的日後維護及擴充

    php 設計模式(轉載)

        /*    
    */

        
    class OperationRem extends
     Operation {        public function
           return $num1%$num12;        }
    現在還有一個問題未解決,就是如何讓程式根據使用者輸入的操作符實例化對應的物件呢? 解決方法:使用一個單獨的類別來實現實例化的過程,這個類別就是工廠

    php 設計模式(轉載)     * 功能:根據輸入的運算符號,工廠就能實例化出適合的物件

         *     


    */


         

    function createObj(php 設計模式(轉載)$operate){

                

    switch ($operate){
                    
    case
     '+':🎠   
    new
     OperationAdd();                     
                        return 
    new OperationSub();                     break;                case '*':                    
    return new OperationSub();                    
    break;                
    case '/':                    return 
    new OperationDiv();                    
    break;            }
            }    }:: $result=$test
    ->getValue(23,0);    echo
     $ result;

    其他關於此模式的筆記:

    工廠模式:
    以交通工具為例子:要求請既可以定制交通工具,又可以定制交通工俱生產的過程
    1>定制交通工具
        1.定義一個接口,內含交工工具的方法(啟動運行停止)
        2.讓飛機,汽車等類去實現他們
    2> 定制工廠(通上類似)一個接口,裡麵包含交工工具的製造方法(啟動運行停止)
        2.分別寫製造飛機,汽車的工廠類別去繼承實現這個接口
     

     原地址com/thread-242243-1-1.html

    3.觀察者模式

     觀察者模式屬於行為模式,是定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴它的物件都被通知並自動刷新。它完美的將觀察者對象和被觀察者對象分開。可以在獨立的物件(主體)中維護一個對主體感興趣的依賴項(觀察器)清單。 讓所有觀察器各自實現公共的 Observer 接口,以取消主體和依賴性物件之間的直接依賴關係。 (反正我看不明白)

    用到了spl (standard php library)

    php 設計模式(轉載)

    public function update(SplSubject $subject
    ) {        echo __CLASS__ . ' - ' . $subjectMy 
    implements SplObserver {    public function update(SplSubject 
    $subject
    ) {
            echo __CLASS__ . ' - ' . $subject
    ->getName( MySubject implements SplSubject {    private $_observers
    ; private $_name;    public
     
    function
     __construct($name  SplObjectStorage();        
    $this->_name = $name ;    }
        public function attach(SplObserver 
    $observer¦ $observer);    }    public 
    function detach(SplObserver $observer) {        
    $this->_observers->detach($observer); () {        
    foreach
     ($this->_observers  as $observer) {
                $observer->update   public 
    function
     getName() {        return $this->_name;     }
    }$observer1 = new
     MyObserver1();
    $observer2 new MySubject("test");
    $subject ->attach($observer1);$subject->attach($observer2);

    $subject

    ->notify(); 

     參考原文:http://www.php.net/manual/zh/class.splsubject.php

    策略4.模式模式在此模式中,

    演算法是從複雜類別中提取的

    ,因而可以方便地替換。例如,如果要變更搜尋引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜尋引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分則是根據排列的結果排序。在複雜的範例中,這些部分都在同一個類別中。透過使用策略模式,您可將排列部分放入另一個類別中,以便變更頁排列的方式,而不會影響搜尋引擎的其餘程式碼。  

    作為一個較簡單的示例,下面顯示了一個用戶列表類,它提供了一個根據

    一組即插即用的策略查找一組用戶

    的方法

    一組即插即用的策略。 //定義介面interface IStrategy {
        function filter($record); FindAfterStrategy 
    implements
     IStrategy {    private  $_name;    public 
    function __construct($name) ;    }
        public function filter($record ) {
            return strcmp ( 
    $this
    ->_name, $record); 實作介面方式1class RandomStrategy implements
     IStrategy {    public function filter($record) {        🠎return
            🠎return
            🠎1.
        }}//主類class UserList {
        private $_list = array ();
        public .      if
     (
    $names
     != null) {        ( $names as
     $name ) {                       }        }    }    
    ) {        $this->_list [] = $name;    
    $filter) {        $recs = array ();
       foreach ( $this->_list as $user ) {        
     ))                $recs [] = $user
    ;
            }
            
    return
     $recs;  array (        "Andy",
            "Jack",        "Jack",    ) );
    $f1
     = 
    $ul->find ( new FindAfterStrategy ( "J )$ FindAfterStrategy ( "J" )$); $f2
     = $ul ->find ( new RandomStrategy () );
    print_r ( 
    $f2 );  高的彈性 
    以上就介紹了php 設計模式(轉載),包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解決方法:您的組織要求您更改 PIN 碼 解決方法:您的組織要求您更改 PIN 碼 Oct 04, 2023 pm 05:45 PM

解決方法:您的組織要求您更改 PIN 碼

Windows 11 上調整視窗邊框設定的方法:變更顏色和大小 Windows 11 上調整視窗邊框設定的方法:變更顏色和大小 Sep 22, 2023 am 11:37 AM

Windows 11 上調整視窗邊框設定的方法:變更顏色和大小

如何在 Windows 11 上變更標題列顏色? 如何在 Windows 11 上變更標題列顏色? Sep 14, 2023 pm 03:33 PM

如何在 Windows 11 上變更標題列顏色?

OOBELANGUAGE錯誤Windows 11 / 10修復中出現問題的問題 OOBELANGUAGE錯誤Windows 11 / 10修復中出現問題的問題 Jul 16, 2023 pm 03:29 PM

OOBELANGUAGE錯誤Windows 11 / 10修復中出現問題的問題

Windows 11 上啟用或停用工作列縮圖預覽的方法 Windows 11 上啟用或停用工作列縮圖預覽的方法 Sep 15, 2023 pm 03:57 PM

Windows 11 上啟用或停用工作列縮圖預覽的方法

Windows 11 上的顯示縮放比例調整指南 Windows 11 上的顯示縮放比例調整指南 Sep 19, 2023 pm 06:45 PM

Windows 11 上的顯示縮放比例調整指南

10種在 Windows 11 上調整亮度的方法 10種在 Windows 11 上調整亮度的方法 Dec 18, 2023 pm 02:21 PM

10種在 Windows 11 上調整亮度的方法

如何在Safari中關閉iPhone的隱私瀏覽身份驗證? 如何在Safari中關閉iPhone的隱私瀏覽身份驗證? Nov 29, 2023 pm 11:21 PM

如何在Safari中關閉iPhone的隱私瀏覽身份驗證?

See all articles