单例
单例很简单就是一个类一个类只初始化一次
定义一个单例类
class Single {
protected static $instance = NULL;
public static function getInstance():static {
if (self::$instance == NULL) {
self::$instance = new static;
}
return self::$instance;
}
}
继承和使用
class DB extends Single {
}
class Logger extends Single {
}
$db = DB::getInstance();
$logger = Logger::getInstance();
多例
如果我们需要的不仅仅是一个记录器实例,因为有些消息必须写入文件中,有些消息需要通过电子邮件发送
定义多例
class Multiple {
protected static array $instance = [];
public static function getInstance($key) {
if (!isset(self::$instance[$key])) {
self::$instance[$key] = new static;
}
return self::$instance[$key];
}
}
// 定义写入日志的接口
interface LoggerHanderInterface {
public function save($level, $message, $context);
}
定义3种写入日志的方式
class DbLogger implements LoggerHanderInterface {
public function save($level, $message, $context) {
print ("Save to db $level: $message");
}
}
class FileLogger implements LoggerHanderInterface {
public function save($level, $message, $context) {
print ("Save File$level: $message");
}
}
class MailLogger implements LoggerHanderInterface {
public function save($level, $message, $context) {
print ("Send mail $level: $message");
}
}
最后定义logger. 这里使用了psr\Log这个包.
class Logger extends Multiple implements \Psr\Log\LoggerInterface {
use \Psr\Log\LoggerTrait;
private LoggerHanderInterface $handle;
public function setHandle(LoggerHanderInterface $hander) {
$this->handle = $hander;
}
public function log($level, $message, array $context = array())
{
$this->handle->save($level, $message, $context);
}
}
测试
$db_logger = Logger::getInstance('db');
$db_logger->setHandle(new DbLogger());
$file_logger = Logger::getInstance('file');
$file_logger->setHandle(new FileLogger());
$mail_logger = Logger::getInstance('mail');
$mail_logger->setHandle(new MailLogger());
// 打印hander 是 DbLogger
$logger1 = Logger::getInstance('db');
var_dump($logger1);
// 打印hander 是 DbLogger
$logger2 = Logger::getInstance('db');
var_dump($logger2);
// 打印hander 是 MailLogger
$logger3 = Logger::getInstance('mail');
var_dump($logger3);