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