php之单例模式
单例模式:指一个类只能实力化一个对象,主要思路,
1:保护或私有构造函数,并用final来修饰,防止外部实例化
2:类内部开放一个公共的静态方法,负责实例化
3:类内部用一个静态属性来存放对象,当静态属性存在对象时,就return该对象,否则就实例化一个对象
1 /* 2 final这个关键词,在php中,可以修饰类,方法,但不能修饰属性 3 final修饰的类,不能继承 4 final修饰的方法,能继承,但不能重写 5 在java中,final也可以修饰属性,此时属性值是一个常量,不可修改 6 */ 7 <?php 8 class s{ 9 public $hash;//随机码 10 static protected $ins = NULL; 11 final protected function __construct(){ 12 $this->hash = mt_rand(1,9999);//用final修饰构造函数,让子类可以继承构造函数,但不能重写 13 } 14 static public function getInstance(){//静态函数,只能用类名::函数名()来访问 15 if (self::$ins instanceof self) {//instanceof 判断某个对象是不是某个类的实例 16 return self::$ins; 17 } 18 self::$ins = new self(); 19 return self::$ins; 20 } 21 } 22 class t extends s{ 23 //protected function __construct(){ 24 //parent::__construct();//Fatal error: Cannot override final method s::__construct()因为父类的构造函数用final修饰,所以不能重写构造函数 25 //} 26 } 27 $s1 = t::getInstance();//访问静态函数 28 $s2 = t::getInstance();//$s2和$s1实际是同一个对象,这样一个简单的单例模式就创造出来了 29 $s3 = clone $s2;//clone一个对象,注意克隆对象不等于原来的对象,只有两个对象同时指向一个地址时才相等 30 print_r($s1); 31 print_r($s2); 32 if ($s1 === $s2) { 33 echo '是一个对象'; 34 }else { 35 echo '不是一个对象'; 36 } 37 echo '<br />'; 38 if ($s2 === $s3) { 39 echo '是一个对象'; 40 }else { 41 echo '不是一个对象'; 42 } 43 //clone又多出一个对象,试问怎么解决? 44 //提示:请看魔术方法clone! 45 //魔术法国法很多,__construct,_destruct,__clone,__callstatic 46 ?>