PHP经典设计模式
单例模式:
单例模式是一种PHP常见的软件设计模式,单例单例,意思就是只有一个实例。单例模式确保某一个类只有一个实例,不能重复实例化,只能它自己实例化,而且内部自行实例化并向整个系统全局地提供这个实例。
因为主要要用到静态类,所以先普及一下静态类的特点:
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。
为什么要使用单例模式?
当你定义了一个类的时候,它被实例化了一次,当其他人对它再次实例化的时候,还是返回第一次实例化的对象,可以避免大量的new操作,减少资源的消耗,接下来我将用代码进行演示单例类和常规类的区别。
PHP常规例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php class Obj { public $str = null ;
public function __construct() { $this->str = mt_rand(111,999); } }
$obj1 = new Obj(); $obj2 = new Obj(); $obj3 = new Obj();
print_r($obj1); print_r($obj2); print_r($obj3);
?>
|
结果:
单例模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?php class Obj { protected static $_Ins; public $str = null;
private function __construct(){ $this->str = mt_rand(111,999); }
private function __clone() { }
public static function getInstance(){ if(!(self::$_Ins instanceof self)){ self::$_Ins = new self(); } return self::$_Ins; } }
$obj1 = Obj::getInstance(); $obj2 = Obj::getInstance(); $obj3 = Obj::getInstance();
print_r($obj1); print_r($obj2); print_r($obj3); ?>
|
结果:
结果中,不同对象的输出是不一样的,所以也证实了单例模式的作用。
介绍单例模式是为下面的经典设计模式所做铺垫,一下代码所演示的类似与一个数据库的注册操作,对象就是每一个用户所注册的信息,而对象树就是所谓的数据库,用来存储。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| <?php
class Site { public $siteName; protected static $instance = null; private function __construct($siteName){ $this->siteName = $siteName; }
public static function getInstance($siteName='大道至简'){ if(!self::$instance instanceof self){ self::$instance = new self($siteName); } return self::$instance; } }
class Factory { public static function create(){ return Site::getInstance('构造方法里面的方法'); } }
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]); } }
Register::set('site',Factory::create());
$obj = Register::get('site');
var_dump($obj); echo '<hr>'; echo $obj->siteName;
|