PHP 单例模式代码片段
1 <?php 2 3 error_reporting(E_ALL | E_STRICT); 4 5 class single{ 6 7 public $hash; 8 9 static protected $ins = null; 10 11 final protected function __construct(){ //final 能被继承,不能被重写(防止子类重写构造方法) 12 $this->hash = mt_rand(1,9999); 13 } 14 15 static public function getInstance(){ 16 if(self::$ins instanceof self){ //instanceof 判断某个对象是不是某个类的实例 17 return self::$ins; 18 } 19 self::$ins = new self(); 20 return self::$ins; 21 } 22 } 23 24 $s1 = single::getInstance(); 25 $s2 = single::getInstance(); 26 27 var_dump($s1); 28 var_dump($s2); 29 30 //son类继承single类 31 class son extends single{ 32 } 33 34 $s1 = son::getInstance(); 35 $s2 = son::getInstance(); 36 37 var_dump($s1); 38 var_dump($s2);
页面输出
object(single)[1] public 'hash' => int 9762 object(single)[1] public 'hash' => int 9762 object(single)[1] public 'hash' => int 9762 object(single)[1] public 'hash' => int 9762
主要思路:
1. 保护或者私有构造函数,防止外部实例化
2. 内部开放一个公共的静态方法,负责实例化
3. 类有一个静态属性,用于存放对象
当静态属性已经存放对象时,直接 return 该对象,否则实例化该类,然后 return 对象。