(1)一般是用静态变量,初始化之后,不会再重复实例化(初始化一次),所以在new之后就一个对象。
(2)当再次调用,判断是否存在这个对象,存在就直接用,不存在就重新new ,避免资源浪费消耗 ,静态变量初始化一次 就会一直存在。
如:在类里可能会多次创建对象访问数据库,如果是单例模式,可避免多次创建对象,只允许创建一个对象,避免资源浪费消耗。
(3)程序运行完,所有变量会消失。
优点:在数据库用单例模式,可以避免一直生产对象。
我的问题:在Api中创建一个对象,多个单例模式,为什么能正常运行?
我的回答:
①测试接口是对一个接口进行访问,每次访问结束,所有变量会消失,进行下一个接口测试时,对象是空的,会重新new一遍,从而正常运行……
②如果在同一时间访问两个不同的类,则不会报错……例如:一个对象obj,两个类book、tag,先创建了book对象,book正常运行,但到tag类时,由于没有实例化tag对象,程序将其按照book类处理,因此不会报错……
③如果在同一个时间访问两个不同的类的方法,则会报错……例如:一个对象obj,两个类book、tag,先创建了book对象,book可以正常运行,但是到tag时,单例模式判断不为空,则直接返回book对象,没有实例化tag类,调用tag类才有的方法时,就会报错……
/**
* 单例类
* Singleton.class
*/
class Singleton {
#静态成品变量 保存全局实例
private static $obj = NULL;
#私有化默认构造方法,保证外界无法直接实例化
private function __construct() {}
#静态工厂方法,返还此类的唯一实例
public static function getInstance() {
if (empty(self::$obj)) {
self::$obj = new Singleton();
#或者这样写
// self::$obj = new self();
}
return self::$obj;
}
#防止用户克隆实例
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}
}