Singleton (Одиночка) — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
<?php
class DatabaseConnection
{
private static $instance = null;
private $connection;
// Приватный конструктор запрещает прямое создание объекта
private function __construct()
{
$this->connection = new PDO(
'mysql:host=localhost;dbname=test',
'username',
'password'
);
}
// Метод для получения экземпляра
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// Запрещаем клонирование
private function __clone() {}
// Запрещаем десериализацию
private function __wakeup() {}
// Пример метода для работы с соединением
public function query($sql)
{
return $this->connection->query($sql);
}
}
// Использование
$db = DatabaseConnection::getInstance();
$results = $db->query('SELECT * FROM users');
public static function getInstance() {
if (self::$instance === null) {
static $lock = true;
if ($lock) {
$lock = false;
self::$instance = new self();
}
}
return self::$instance;
}
private function __construct($config) {
$this->connection = new PDO(
$config['dsn'],
$config['username'],
$config['password']
);
}
public static function getInstance($config = null) {
if (self::$instance === null && $config !== null) {
self::$instance = new self($config);
}
return self::$instance;
}
class Logger
{
private static $instance;
private $logFile;
private function __construct() {
$this->logFile = fopen('app.log', 'a');
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function log($message) {
fwrite($this->logFile, date('Y-m-d H:i:s') . " - $message\n");
}
}
// Использование в разных частях приложения
Logger::getInstance()->log('User logged in');
Logger::getInstance()->log('Data saved');