单例模式:一个类只能有一个实例(只能实例化一次)
为何用单例模式:
一、为了防止资源浪费。
二、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
三、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
应用场景:
1.PHP的应用有一个大方面是针对于数据库,一个应用中会存在大量的数据库操作,在使用面向对象的方式开发时,如果使用单例模式,就可以避免大量的new 操作消耗的资源,还可以减少数据库连接,这样就不容易出现too many connections情况。
2.如果一个系统中需要一个类来全局控制某些配置信息,那么,使用单例模式可以很方便的实现。
3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
特点是什么?
final标识的类【禁止继承】
私有构造函数【防止类外实例化】
私有克隆方法【禁止被克隆】
私有静态属性【保存类的实例对象】
公有静态函数【调用类的接口】
以上行为的目的:防止程序重新实例化【消费新的资源】
<?php
final class single{
private $rand = 0;
// 存放实例化的对象
static private $obj = null;
// 防止类外实例化
private function __construct(){
return $this->rand = mt_rand(1,99999);
}
// 调用类的接口
static public function usb(){
if(!self::$obj){
self::$obj = new single();
}
return self::$obj;
}
public function fff(){
echo $this->rand;
}
// 防止用户克隆
private function __clone(){
echo '禁止克隆!';
}
}
$single1 = single::usb();
$single2 = single::usb();
print_r($single1);
print_r($single2);
$single2 ->fff();