標籤:method mys 狀態 ret mysqli gis 交通 策略模式 roo
- 單例模式 (確保一個類只執行個體化一次並且可以自行執行個體化)
- 原廠模式 (替代了new操作)
- 策略模式 (使用不同的方法來達到同樣的目的)
- 觀察者模式 (一個對象發生變化時其他對象也會觸發相應的操作)
- 適配器模式 (把不同的方法封裝成統一的方法)
- 註冊模式 (把執行個體放進一個數組以供調用)
這些設計模式在常見的php架構:ThinkPHP, Yii2等都有用到.
/* * 單例模式 * 確保此類只有一個執行個體並可以自行執行個體化 * 用在: 資料庫操作, 日誌對象 等. */class single{ public $db = NULL; static $instance = null; public function __construct() { $this->db = new mysqli(‘127.0.0.1‘, ‘root‘, ‘root‘, ‘test‘); if($this->db->connect_error){ die(‘connect error:‘ . $this->db->connect_error); } echo "mysql connect successful\n"; } static public function getInstance(){ if(!(self::$instance instanceof self)){ self::$instance = new self(); echo "aaa\n"; } echo "bbb\n"; return self::$instance; } public function __destruct() { $this->db->close(); }}single::getInstance();single::getInstance();//輸出:/* mysql connect successful aaa bbb bbb*/
/** * 原廠模式 * 用Factory 方法代替new操作的一種模式 */interface people{ public function say();}class man implements people{ public function say() { echo "i am man \n"; }}class woman implements people{ public function say() { echo "i am woman \n"; }}class factory{ public function createMan(){ return new man(); } public function createWoman(){ return new woman(); }}$f = new factory();$f->createMan()->say();$f->createWoman()->say();//輸出/* i am man i am woman */
/** * 策略模式 [使用不同的方式達到同一個目的] * 情境:乘坐不同交通工具去公司上班 */abstract class tools{ abstract function working();}class bicyle extends tools{ public function working() { echo __METHOD__ . "\n"; }}class car extends tools{ public function working() { echo __METHOD__ . "\n"; }}class transport{ public function running($obj){ $obj->working(); } /** * 使用魔術方法也可以達到上述效果 * @param type $name * @param type $arguments */ public function __call($name, $arguments) { $arguments[0]->$name(); }}$t = new transport();$t->running(new car());$t->running(new bicyle());$t->working(new car());//使用魔術方法也可以達到上述效果//輸出/* car::working bicyle::working car::working */
/* * 觀察者模式 * 當一個對象狀態發生變化時,依賴它的對象全部收到觸發操作 * 發生情境:yii2的behavior,event */interface event{ function run();}class e1 implements event{ public function run() { echo __METHOD__ . "\n"; }}class e2 implements event{ public function run() { echo __METHOD__ . "\n"; }}class observer{ static $obs; function addObs($name, $obj){ self::$obs[$name] = $obj; } function trigger(){ foreach (self::$obs as $val){ $val->run(); } }}$o = new observer();$o->addObs(‘e1‘, new e1());$o->addObs(‘e2‘, new e2());$o->trigger();//輸出/* e1::run e2::run */
/* * 適配器模式 * 把不同的方法封裝成統一的方法以供調用 * 用在 資料庫 mysql, mysqli, pdo 等 */interface db{ public function connect(); public function query(); public function close();}class mysqlA implements db{ public $db; public function connect(){ $this->db = mysqli_connect($host, $user, $password, $database, $port, $socket); } public function query(){ } public function close(){ mysqli_close($this->db); }}class mysqlB implements db{ public $db; public function connect() { $this->db = new PDO($dsn, $username, $password); } public function query(){ } public function close(){ $this->db = null; }}
/* * 註冊模式 * 把已有對象放入一個數組裡以供調用 */class register{ static $objects; public static function set($name, $obj){ self::$objects[$name] = $obj; } public static function get($name){ return self::$objects[$name]; }}class log{};register::set(‘log‘, new log());$log = register::get(‘log‘);
php常用設計模式