单例可以用于产生唯一不重复的数字码,比如订单号。
<?php
final class Mysql // final 表示不允许被继承
{
/**
* @var self 用于保存实例
*/
private static $instance;
/**
* @var int
*/
public $int;
/**
* 实例化对象
*
* @return self
*/
public static function getInstance()
{
if (!(self::$instance instanceof self)) { // 判断这个类是否已被实例化了(如果!($instance是对象且属于Mysql类))
self::$instance = new self(); // 第一次调用时,$instance只是一个初始化变量,所以不会是对象。就进行实例化
}
return self::$instance; // 已经实例化过了就直接返回该实例
}
/**
* 构造函数为私有,这样就不能new了
*/
private function __construct()
{}
/**
* 防止对象被复制
*/
private function __clone()
{
trigger_error('Clone is not allowed !'); // 返回一个错误
}
}
/**
* 无论这里产生多少个,它们都是同一个实例,因为实例化过了就会return
*/
$mysql1 = Mysql::getInstance(); // 获取实例
$mysql2 = Mysql::getInstance(); // 获取实例
$mysql3 = Mysql::getInstance(); // 获取实例
/**
* 在同一个实例的情况下,给int赋值,就会覆盖
*/
$mysql1->int = 1;
$mysql2->int = 2;
$mysql3->int = 3;
/**
* 此时,还是同一个实例,上面最后覆盖的是3,那么这里就是打印了三次实例中的int变量
*/
print_r($mysql1->int);
print_r($mysql2->int);
print_r($mysql3->int);
如果以new的形式,最终打印结果就是123。
但是单例使用了静态修饰,当进入页面并使用了这个类时开始,直到页面执行完毕前,这个$instance
都会一直存于内存。
所以当你Mysql::getInstance();
获取实例的时候,其实获取的都是内存中同一个$instance