单例即一个类是能有一个实例,并提供一个当前类的全局唯一访问入口(getInstance)。防止类被多次实例化和clone。
test(); // new Singleton(); // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context // clone $single1; // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context
输出:
object(Singleton)#1 (0) { } object(Singleton)#1 (0) { } 这是一个单例模式二、单例模式的应用tp6框架容器中单例模式:
class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable
{
protected static $instance;
protected $instances = [];
protected $bind = [];
protected $invokeCallback = [];
public static function getInstance()
{
if (is_null(static::$instance)) {
static::$instance = new static;
}
if (static::$instance instanceof Closure) {
return (static::$instance)();
}
return static::$instance;
}
// ...
}数据库连接query('set names utf8mb4');
self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('error:' . $e->getMessage());
}
}
// 禁止clone
private function __clone()
{
}
public static function getInstance(): object
{
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function query(string $sql = ''): array
{
return self::$db->query($sql)->fetch();
}
}
$mysql = SingletonMysql::getInstance();
var_dump($mysql->query('SELECT VERSION();'));输出结果:
array(2) { ["VERSION()"]=> string(6) "5.7.26" [0]=> string(6) "5.7.26" }测试代码下载:
singleton.zip



