背景
单例模式可以避免大量new从而减少资源消耗。但当项目中有多个单例类,每新建一个类都要做到三私一公,显然是做了重复工作,不仅浪费时间而且代码也很难维护。
解决方案
php一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决单继承问题,PHP5.4起,PHP实现了一种代码复用的方法,称为trait。下面用trait来封装单例
实现
话不多说,直接贴代码
<?php
/**
* Trait Singleton 单例模式
*/
trait Singleton
{
private static $instance;
static function getInstance(...$args)
{
if(!isset(self::$instance)){
self::$instance = new static(...$args);
}
return self::$instance;
}
}
// 多继承用法 如下:
//其他类在代码中 use Singleton, 即可继承单例
/**
* Class YeTest1 测试类1 继承实例
*/
class YeTest1 {
use Singleton;
/**
* @return string
*/
public function getInfo()
{
return 'my name is yetest1';
}
}
/**
* Class YeTest2 测试类2 继承实例
*/
class YeTest2 {
use Singleton;
/**
* @return string
*/
public function getInfo()
{
return 'my name is yetest2';
}
}
//示例调用
echo YeTest1::getInstance()->getInfo();
echo PHP_EOL;echo "\r\n";
echo YeTest2::getInstance()->getInfo();