[設計模式] 單例模式

ajiang02發表於2020-01-16

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 協議》,轉載必須註明作者和本文連結

相關文章