实现单例模式并不是一件困难的事,思路也有很多。但我发现用PHP的特性Trait来实现非常优雅和灵活。
trait SingletonTrait
{
protected static $instances;
public static function getInstance()
{
if (!static::$instances) {
static::$instances = new static(); // 为什么是static,不是self ?
}
return self::$instances;
}
}
这样,任意类只要引入了这个trait,就自动拥有了实现单例的功能:
class User
{
use SingletonTrait; // 引入单例模式
protected $time;
private function __construct()
{
$this->time = microtime(true);
}
public function println()
{
echo $this->time, PHP_EOL;
}
}
User::getInstance()->println(); // 输出 1563000751.3937
User::getInstance()->println(); // 输出 1563000751.3937
User::getInstance()->println(); // 输出 1563000751.3937
输出的时间相同,说明是同一个类。