php設計模式之單例模式、工廠模式與觀察者模式
本文介绍下,php设计模式中的三种模式,分别是单例模式、工厂模式与观察者模式,有需要的朋友参考下。
一,单例模式 应用程序中只会有这个类的一个实例存在。 比如,单例模式只让一个对象去访问数据库,从而防止打开多个数据库连接。 一个单例类应包括以下几点: 和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private。 要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实 例的公共静态方法。 在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为基提供一个空的私有__clone()方法。 一个基本的单例模式: <?php class SingetonBasic { private static $instance; // other vars.. private function __construct() { // do construct.. } private function __clone() {} public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } // other functions.. } $a = SingetonBasic::getInstance(); $b = SingetonBasic::getInstance(); var_dump($a === $b); ?> 登入後複製 二,工厂模式 工厂模式,可以根据输入参数或者应用程序配置的不同来创建一种专门用来实现化并返回其它类的实例的类。 一个最基本的工厂模式: <?php class FactoryBasic { public static function create($config) { } } ?> 登入後複製 一个描述形状对象的工厂,它希望根据传入的参数个数不同来创建不同的形状。 <?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); } } // 根据传入的参数个数不同来创建不同的形状。 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()); ?> 登入後複製 说明: 工厂模式使得在调用方法时变得更容易,因为它只有一个类和一个方法,若没有使用工厂模式,则要在调用时决定应该调用哪个类和哪个方法;使用工厂模式还使得未来对应 用程序做改变时更加容易,比如要增加一种形状的支持,只需要修改工厂类中的create()一个方法,而没有使用工厂模式,则要修改调用形状的代码块。 三,观察者模式 观察者模式,提供了避免组件之间紧密耦合的另一种方法。 该模式很简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。 这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。 一个简单的观察者模式的例子: 当听众在收听电台时(即电台加入一个新听众),它将发送出一条提示消息,通过发送消息的日志观察者可以观察这些消息。 <?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. '; } } // 模拟另外一个观察者类 class OtherObserver extends Observer { protected $name = 'other'; public function onListen($sender, $args) { echo 'other observer.. '; } } $rs = new RadioStation(); // 注入观察者 $rs->addObserver(new RadioStationLogger()); $rs->addObserver(new OtherObserver()); // 移除观察者 $rs->removeObserver('other'); // 可以看到观察到的信息 $rs->addListener('cctv'); ?> 登入後複製 |

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
