亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > PHP中常用的三種設(shè)計模式詳解【單例模式、工廠模式、觀察者模式】

PHP中常用的三種設(shè)計模式詳解【單例模式、工廠模式、觀察者模式】

熱門標簽:外呼系統(tǒng)能給企業(yè)帶來哪些好處 余姚電話機器人 咸寧銷售電銷機器人系統(tǒng) 開發(fā)地圖標注類網(wǎng)站 百度地圖標注偏差 電銷機器人問門薩維品牌my 400電話蘭州申請請 百度地圖怎樣標注圖標 廣東廣州在怎么申請400電話

本文實例講述了PHP中常用的三種設(shè)計模式。分享給大家供大家參考,具體如下:

PHP中常用的三種設(shè)計模式:單例模式、工廠模式、觀察者模式

1.單例模式

為何要使用PHP單例模式?

多數(shù)人都是從單例模式的字面上的意思來理解它的用途, 認為這是對系統(tǒng)資源的節(jié)省, 可以避免重復實例化, 是一種”計劃生育”. 而PHP每次執(zhí)行完頁面都是會從內(nèi)存中清理掉所有的資源. 因而PHP中的單例實際每次運行都是需要重新實例化的, 這樣就失去了單例重復實例化的意義了. 單單從這個方面來說, PHP的單例的確有點讓各位失望. 但是單例僅僅只有這個功能和應用嗎? 答案是否定的。

  1. php的應用主要在于數(shù)據(jù)庫應用, 所以一個應用中會存在大量的數(shù)據(jù)庫操作, 在使用面向?qū)ο蟮姆绞介_發(fā)時(廢話), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。
  2. 如果系統(tǒng)中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現(xiàn). 這個可以參看zend Framework的FrontController部分。
  3. 在一次頁面請求中, 便于進行調(diào)試, 因為所有的代碼(例如數(shù)據(jù)庫操作類db)都集中在一個類中, 我們可以在類中設(shè)置鉤子, 輸出日志,從而避免到處var_dump, echo。

一個單例類應包括以下幾點:

和普通類不同,單例類不能被直接實例化,只能是由自身實例化。因此,要獲得這樣的限制效果,構(gòu)造函數(shù)必須標記為private

要讓單例類不被直接實例化而能起到作用,就必須為其提供這樣的一個實例。因此,就必須要讓單例類擁有一個能保存類的實例的私有靜態(tài)成員變量和對應的一個能訪問到實例的公共靜態(tài)方法。

在PHP中,為防止對單例類對象的克隆來打破單例類的上述實現(xiàn)形式,通常還為其提供一個空的私有__clone()方法。

對于一個類的對象,如果使用“clone運算符”,就會復制出一個和當前對象完全一樣的新對象出來,并且,此時還會自動調(diào)用該類的魔術(shù)方法:__clone()(只要該類中有該方法)。

則要實現(xiàn)單例類,就應該對這個單例類的對象“禁止克隆”,用private來修飾__clone()來實現(xiàn)禁止克隆,具體可參考單例類的加強:禁止克隆。

單例模式的例子:

?php
/**
* 設(shè)計模式之單例模式
* $instance必須聲明為靜態(tài)的私有變量
* 構(gòu)造函數(shù)和析構(gòu)函數(shù)必須聲明為私有,防止外部程序new
* 類從而失去單例模式的意義
* getInstance()方法必須設(shè)置為公有的,必須調(diào)用此方法
* 以返回實例的一個引用
* ::操作符只能訪問靜態(tài)變量和靜態(tài)函數(shù)
* new對象都會消耗內(nèi)存
* 使用場景:最常用的地方是數(shù)據(jù)庫連接。
* 使用單例模式生成一個對象后,
* 該對象可以被其它眾多對象所使用。
*/
class SingetonBasic {
private static $instance; //靜態(tài)變量要私有化,防止類外修改
// other vars..
private function __construct() {  //構(gòu)造函數(shù)私有化,類外不能直接新建對象
  // do construct..
}
private function __clone() {}  //在__clone()前用private修飾,用來禁止克隆
public static function getInstance() { //公共的靜態(tài)方法,public——外部的接口,static——不使用對象而是通過類名訪問
  if (!(self::$instance instanceof self)) { //私有靜態(tài)變量$instance為空
    self::$instance = new self(); //新建為自身的對象,并賦值給私有變量$instance
  }
  return self::$instance; //返回私有變量$instance
}
// other functions..
}
$a = SingetonBasic::getInstance();
$b = SingetonBasic::getInstance();
var_dump($a === $b);  //結(jié)果為:boolean true
//?>

?php
/**
 * php單例,單例模式為何只能實例化一次
*/
class Example{
  // 保存類實例在此屬性中
  private static $instance;
  // 構(gòu)造方法聲明為private,防止直接創(chuàng)建對象
  private function __construct(){
    echo 'I am constructed';
  }
  // singleton 方法
  public static function singleton(){
    if (!isset(self::$instance)) {//判斷是否以前創(chuàng)建了當前類的實例
      $c = __CLASS__;//獲取類名
      self::$instance = new $c;//如果沒有創(chuàng)建,實例化當前類,這里實現(xiàn)類只實例化一次
    }
    return self::$instance;//返回類的實例
  }
  // Example類中的普通方法
  public function bark(){
    echo 'Woof!';
  }
  // 阻止用戶復制對象實例
  public function __clone(){
    trigger_error('Clone is not allowed.', E_USER_ERROR);
  }
}
// 這個寫法會出錯,因為構(gòu)造方法被聲明為private
$test = new Example;
// 下面將得到Example類的單例對象
$test = Example::singleton();
$test->bark();
// 下面將得到Example類的單例對象
$test = Example::singleton();
$test->bark();
// 復制對象將導致一個E_USER_ERROR.
$test_clone = clone $test;
?>

關(guān)于__clone()方法可參考: PHP對象克隆__clone()介紹

2. 工廠模式

工廠模式在于可以根據(jù)輸入?yún)?shù)或者應用程序配置的不同來創(chuàng)建一種專門用來實現(xiàn)化并返回其它類的實例的類。

工廠模式的例子:

?php
class FactoryBasic {
  public static function create($config) {
  }
}

比如這里是一個描述形狀對象的工廠,它希望根據(jù)傳入的參數(shù)個數(shù)不同來創(chuàng)建不同的形狀。

?php
// 定義形狀的公共功能:獲取周長和面積。
interface IShape {
  function getCircum();
  function getArea();
}
// 定義矩形類
class Rectangle implements IShape {
  private $width, $height;
  public function __construct($width, $height) {
    $this->width = $width;
    $this->height = $height;
  }
  public function getCircum() {
    return 2 * ($this->width + $this->height);
  }
  public function getArea() {
    return $this->width * $this->height;
  }
}
// 定義圓類
class Circle implements IShape {
  private $radii;
  public function __construct($radii) {
    $this->radii = $radii;
  }
  public function getCircum() {
    return 2 * M_PI * $this->radii;
  }
  public function getArea() {
    return M_PI * pow($this->radii, 2);
  }
}
// 根據(jù)傳入的參數(shù)個數(shù)不同來創(chuàng)建不同的形狀。
class FactoryShape {
  public static function create() {
    switch (func_num_args()) {
      case 1:
      return new Circle(func_get_arg(0));
      break;
      case 2:
      return new Rectangle(func_get_arg(0), func_get_arg(1));
      break;
    }
  }
}
// 矩形對象
$c = FactoryShape::create(4, 2);
var_dump($c->getArea());
// 圓對象
$o = FactoryShape::create(2);
var_dump($o->getArea());

使用工廠模式使得在調(diào)用方法時變得更容易,因為它只有一個類和一個方法,若沒有使用工廠模式,則要在調(diào)用時決定應該調(diào)用哪個類和哪個方法;使用工廠模式還使得未來對應用程序做改變時更加容易,比如要增加一種形狀的支持,只需要修改工廠類中的create()一個方法,而沒有使用工廠模式,則要修改調(diào)用形狀的代碼塊。

3. 觀察者模式

觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對象無關(guān)。結(jié)果是對象可以相互對話,而不必了解原因。

一個簡單的示例:當聽眾在收聽電臺時(即電臺加入一個新聽眾),它將發(fā)送出一條提示消息,通過發(fā)送消息的日志觀察者可以觀察這些消息。

?php
// 觀察者接口
interface IObserver {
  function onListen($sender, $args);
  function getName();
}
// 可被觀察接口
interface IObservable {
  function addObserver($observer);
  function removeObserver($observer_name);
}
// 觀察者類
abstract class Observer implements IObserver {
  protected $name;
  public function getName() {
    return $this->name;
  }
}
// 可被觀察類
class Observable implements IObservable {
  protected $observers = array();
  public function addObserver($observer) {
    if (!($observer instanceof IObserver)) {
      return;
    }
    $this->observers[] = $observer;
  }
  public function removeObserver($observer_name) {
    foreach ($this->observers as $index => $observer) {
      if ($observer->getName() === $observer_name) {
        array_splice($this->observers, $index, 1);
        return;
      }
    }
  }
}
// 模擬一個可以被觀察的類:RadioStation
class RadioStation extends Observable {
  public function addListener($listener) {
    foreach ($this->observers as $observer) {
      $observer->onListen($this, $listener);
    }
  }
}
// 模擬一個觀察者類
class RadioStationLogger extends Observer {
  protected $name = 'logger';
  public function onListen($sender, $args) {
    echo $args, ' join the radiostation.br/>';
  }
}
// 模擬另外一個觀察者類
class OtherObserver extends Observer {
  protected $name = 'other';
  public function onListen($sender, $args) {
    echo 'other observer..br/>';
  }
}
$rs = new RadioStation();
// 注入觀察者
$rs->addObserver(new RadioStationLogger());
$rs->addObserver(new OtherObserver());
// 移除觀察者
$rs->removeObserver('other');
// 可以看到觀察到的信息
$rs->addListener('cctv');
?>

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計有所幫助。

您可能感興趣的文章:
  • php設(shè)計模式之觀察者模式實例詳解【星際爭霸游戲案例】
  • PHP設(shè)計模式之觀察者模式入門與應用案例詳解
  • php設(shè)計模式之觀察者模式定義與用法經(jīng)典示例
  • PHP設(shè)計模式之觀察者模式定義與用法分析
  • PHP設(shè)計模式(觀察者模式)

標簽:鷹潭 麗江 巴彥淖爾 銅陵 臨沂 重慶 十堰 衡陽

巨人網(wǎng)絡(luò)通訊聲明:本文標題《PHP中常用的三種設(shè)計模式詳解【單例模式、工廠模式、觀察者模式】》,本文關(guān)鍵詞  PHP,中常,用的,三種,設(shè)計模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP中常用的三種設(shè)計模式詳解【單例模式、工廠模式、觀察者模式】》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP中常用的三種設(shè)計模式詳解【單例模式、工廠模式、觀察者模式】的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    99色精品| 青青久在线视频| 国产一区二区高清视频| 美女被草网站| 深夜做爰性大片中文| 91麻豆高清国产在线播放| 国产视频一区二区在线观看| 精品国产一区二区三区久 | 国产精品123| 欧美激情中文字幕一区二区| 日韩av片免费播放| 可以免费在线看黄的网站| 国产成人精品影视| 久久99这里只有精品国产| 麻豆网站在线看| 国产a毛片| 欧美1区| 黄视频网站在线看| 韩国毛片免费大片| 黄视频网站免费观看| 一本高清在线| 色综合久久久久综合体桃花网| 日本特黄特色aaa大片免费| 黄视频网站免费观看| 亚洲精品影院| 国产伦久视频免费观看 视频 | 国产亚洲精品成人a在线| 精品视频在线看| 成人a大片在线观看| 97视频免费在线| 国产网站麻豆精品视频| 你懂的福利视频| 天天做日日爱夜夜爽| 欧美国产日韩一区二区三区| 色综合久久手机在线| 国产精品1024永久免费视频| 国产成+人+综合+亚洲不卡| 欧美另类videosbestsex视频| 国产国产人免费视频成69堂| 久久精品店| 日本伦理片网站| 久久国产一久久高清| 精品视频在线看| 欧美激情伊人| 999久久狠狠免费精品| 精品国产一区二区三区免费| 亚洲精品永久一区| 欧美激情一区二区三区视频| 精品国产一区二区三区久久久狼| 台湾毛片| 免费国产一级特黄aa大片在线| 国产一区精品| 成人影院一区二区三区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 超级乱淫伦动漫| 青草国产在线| 欧美激情一区二区三区中文字幕| 999久久狠狠免费精品| 国产一区免费观看| 91麻豆精品国产自产在线| 韩国三级视频网站| 黄视频网站在线看| 国产一区二区精品在线观看| 黄色福利片| 日韩专区亚洲综合久久| 久久国产影视免费精品| 国产视频在线免费观看| 日本在线www| 国产视频一区二区三区四区| 久久精品人人做人人爽97| 国产伦理精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人影视在线播放| 四虎影视久久久| 一级女性全黄久久生活片| 一级毛片视频在线观看| 久久久久久久久综合影视网| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩免费在线观看视频| 亚州视频一区二区| 午夜激情视频在线观看| 国产不卡高清在线观看视频| 国产一区二区精品久| 日本特黄特黄aaaaa大片| 国产激情视频在线观看| 成人影院一区二区三区| 成人影院一区二区三区| 日韩av东京社区男人的天堂| 欧美电影免费| 日本乱中文字幕系列| 国产伦久视频免费观看 视频| 黄视频网站免费| 免费国产在线视频| 精品国产一区二区三区国产馆| 免费国产在线观看不卡| 精品国产三级a| 国产不卡精品一区二区三区| 精品国产香蕉在线播出| 久久国产精品只做精品| 国产不卡精品一区二区三区| 亚洲www美色| 黄色短视频网站| 精品在线免费播放| 黄视频网站免费| 成人影院一区二区三区| 韩国毛片 免费| 天天做日日爱夜夜爽| 美女免费精品视频在线观看| 久久国产精品自由自在| 九九热国产视频| 国产高清在线精品一区a| 日韩一级黄色| 国产一级强片在线观看| 国产高清视频免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频在线观看免费| 日本特黄特黄aaaaa大片| 精品国产亚一区二区三区| 久久国产影院| 精品视频一区二区三区| 欧美激情一区二区三区视频高清| 国产a视频| 久久精品免视看国产成人2021| 久久99中文字幕| 九九久久99综合一区二区| 精品在线视频播放| 午夜欧美成人久久久久久| 毛片成人永久免费视频| 精品久久久久久中文字幕一区| 日韩中文字幕一区| 高清一级片| 国产不卡在线播放| 欧美大片aaaa一级毛片| 国产高清在线精品一区a| 香蕉视频三级| 国产一区二区精品| 香蕉视频久久| 91麻豆tv| 欧美国产日韩久久久| 国产伦久视频免费观看 视频 | 欧美一级视| 国产精品123| 天天色成人| 美女免费毛片| 91麻豆精品国产高清在线| 欧美激情一区二区三区视频 | 夜夜操天天爽| 黄视频网站免费观看| 欧美激情一区二区三区视频高清| 九九免费精品视频| 精品久久久久久影院免费| 午夜激情视频在线播放| 欧美激情一区二区三区在线播放| 欧美激情一区二区三区在线| 国产综合91天堂亚洲国产| 免费的黄视频| 国产国语对白一级毛片| 亚洲精品影院| 韩国三级一区| 久久精品人人做人人爽97| 成人高清视频在线观看| 欧美激情一区二区三区在线播放| 精品国产香蕉伊思人在线又爽又黄| 国产激情一区二区三区| 美女免费黄网站| 日韩一级黄色片| 成人免费观看的视频黄页| 国产伦精品一区二区三区无广告| 国产亚洲男人的天堂在线观看| 日日日夜夜操| 国产一区国产二区国产三区| 青青久在线视频| 精品国产香蕉在线播出| 亚洲 男人 天堂| a级黄色毛片免费播放视频| 91麻豆国产福利精品| 日韩在线观看免费| 国产成a人片在线观看视频| 久久国产精品自由自在| 韩国三级视频网站| 欧美大片aaaa一级毛片| 国产成人精品在线| 久久99这里只有精品国产| 九九久久99| 日韩专区一区| 成人免费一级纶理片| 九九久久99综合一区二区| 久久精品大片| 精品国产亚一区二区三区| 欧美国产日韩一区二区三区| 四虎论坛| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 高清一级毛片一本到免费观看| 亚欧乱色一区二区三区| 999久久狠狠免费精品| 国产91丝袜在线播放0| 日韩av片免费播放| 国产伦精品一区二区三区在线观看| 国产成人欧美一区二区三区的| 九九精品久久久久久久久|