[设计模式] 单例模式
Singleton.php文件
<?php
namespace app\singleton\controller;
/**
* Class Singleton 单例模式
*/
class Singleton
{
/**
* @var null private\static:一个类只有一个实例
*/
private static $singleton = null;
/**
* Singleton constructor. private:不允许外部实例化,类必须自行创建这个实例
*/
private function __construct()
{
}
/**
* private:不允许外部通过克隆实例化类
*/
private function __clone()
{
}
/**
* @return Singleton|null 类自行实例
*/
static public function getInstance()
{
// 如果还未实例化,则 new
if (is_null(self::$singleton)) {
self::$singleton = new self();
}
return self::$singleton;
}
}
TestSingleton.php文件
<?php
namespace app\singleton\controller;
use PHPUnit\Framework\TestCase; // composer 安装 PHPUnit
/**
* Class TestSingleton 利用 PHPUnit 来测试
*/
class TestSingleton extends TestCase
{
public function test()
{
// 调用两次 getInstance()
$one = Singleton::getInstance();
$two = Singleton::getInstance();
// 断言这两个对象是相等的。结果是相等。
$this->assertEquals($one, $two);
}
}
测试结果
PHPUnit 笔记
断言方法的用法:静态 vs. 非静态
1、PHPUnit 的各个断言是在 PHPUnit\Framework\Assert 中实现的。
PHPUnit\Framework\TestCase 则继承于 PHPUnit\Framework\Assert。
2、各个断言方法均声明为 static,可以以 PHPUnit\Framework\Assert::assertTrue() 的方式调用,
也可以以 $this->assertTrue() 或 self::assertTrue() 的方式调用。
3、实际上,只要包含了 PHPUnit 中的 src/Framework/Assert/Functions.php 源码文件,
就可用 assertTrue() 这样的方式来调用全局函数封装。
4、断言方法是声明为 static 的,这使其可以(重)用于测试对象的作用域之外。
全局函数封装让开发者用 assertTrue() 代替 $this->assertTrue() 或者 self::assertTrue() 。
本作品采用《CC 协议》,转载必须注明作者和本文链接