PHP經典設計模式php
<?php /** * 單例模式 */ class Site { #定義屬性 public $siteName; #定義本類的靜態實例 protected static $instance=null; #禁用構造方法 private function __construct($siteName) { #初始化$siteName屬性 $this->siteName=$siteName; } #獲取本類的惟一實例 public static function getInstance($siteName="我是本類的惟一實例") { #檢測$instance屬性是否屬於本類 if (!self::$instance instanceof self){ self::$instance=new self($siteName); } return self::$instance; } } /** *用工廠模式生成本類的單一實例 */ class Factory { #建立指定類的實例 public static function create() { return Site::getInstance("我是傳入的字符"); } } /** * 對象註冊樹,註冊模式 * 一、註冊:set(),把對象放樹上 * 二、獲取:get(),把對象取下來使用 * 三、註銷:_unset(),把對象註銷 */ class Register { #建立對象池,數組存儲 protected static $objects=[]; #生成對象並掛樹上 public static function set($alias,$object) { self::$objects[$alias]=$object; } #從樹上取下對象 public static function get($alias) { return self::$objects[$alias]; } #把對象從樹上註銷 public static function _unset($alias) { unset(self::$objects[$alias]); } } #將Site類的實例掛樹上去,放到對象池 Register::set('site',Factory::create()); #從樹上取下對象 $obj=Register::get('site'); #查看一下該對象 var_dump($obj); echo"<hr>"; echo $obj->siteName; ?>
運行結果設計模式
Trait類的複用數組
<?php /** * Trait實現了代碼的複用 * 而且突破了單繼承的限制 * Trait似類非類,不能實例化 */ trait Demo1 { public function hello() { return __METHOD__; } } trait Demo2 { public function hello() { return __METHOD__; } } class Test { public function hello() { return __METHOD__; } } class Demo extends Test { #使用use關鍵字聲明trait,方法同名優先級:本類、trait、父類 #Demo1的hello1方法替代Demo2的hello方法 use Demo1,demo2{ Demo1::hello insteadof Demo2; Demo2::hello as Demo2Hello; } public function hello() { return __METHOD__; } #經過trait使用 public function test1() { #Demo1中的方法 return $this->hello(); } public function test2() { return $this->Demo2Hello(); } } $obj=new Demo(); echo $obj->hello(); echo "<hr>"; echo $obj->test1(); ?>
運行結果this
當trait裏的方法和本類以及父類同名時的優先級:當前類方法 > trait
的方法 > 父類的方法spa