功能:
创建唯一的对象实例。
为什么要使用单例模式:
- 减少频繁创建对象,节省资源;
- 静态对象公用,节省内存;
- 功能解耦,方便代码维护;
疑问
问题:PHP自己会回收页面的变量,那单例模式生成的对象就留不住了?
解答:PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.NET、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。这也是为什么php中的单例模式不会有线程安全问题。
使用场景
使用场景非常广泛:数据库连接类,节省宝贵的数据库连接资源,在tp5.1中,容器类,商城里面的购物车类等等等等
实现方法
概念:三私一公。一个私有的构造方法,一个私有的静态变量,一个私有的克隆方法,一个公有的静态创建唯一实例的方法
代码:
<?php
class Singleton
{
// 私有的静态属性
private static $instance = null;
// 私有的构造方法
private function __construct(){
echo "new-class<br />";
}
// 私有的克隆方发
private function __clone()
{
}
// 公有的获取唯一对象的方法
public static function getInstance(){
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
public function getInfo(){
return 'ABC';
}
}
使用:
<?php
namespace app\index\controller;
class Index
{
// 实例化了三次
public function getSingleton(){
$info = \Singleton::getInstance()->getInfo();
\Singleton::getInstance()->getInfo();
\Singleton::getInstance()->getInfo();
\Singleton::getInstance()->getInfo();
echo $info;
}
}
效果: