单例模式

什么是单例模式?

  • 顾名思义:单个实例模式。最直接的描述是:在一个进程或一个线程中,只存在一个类的实例。

应用场景?

  • 1、系统全局生命周期内,需要共用某个全局对象、变量。
  • 2、为降低高频实例创建而应用。

注意事项

  • 由于一个进程内可能会多次访问单例对象,请注意对象上下文的更新。(例如:对象内的某个值初始是 1,有可能会被某次调用修改为 2,则此值在全局范围内会变成 2)

代码实例

Config.php

<?php
namespace com\wdqz\singleton;

/**
 * 单例模式
 * - 本类以常见的系统配置举例
 *
 * @author woodhead
 * @date 2023年11月19日19:20:18
 */
class Config
{
    /**
     * @var array $config 配置类内置对象,用于保存全局数据
     */
    private $config = [];

    /**
     * @var Config $instance 单例对象
     */
    private static $instance;

    /**
     * 构造函数
     * - 声明为 private,禁止外部直接实例化
     */
    private function __construct()
    {
    }

    /**
     * 为全局提供的Config类的实例
     * - 通常情况下,单例模式都采用懒汉单例模式
     *
     * @return Config|self
     */
    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    /**
     * 设置配置项
     *
     * @param $key
     * @param $val
     * @return void
     */
    public function setConfig($key, $val)
    {
        $this->config[$key] = $val;
    }

    /**
     * 获取配置项
     *
     * @param $key
     * @return mixed|string
     */
    public function getConfig($key)
    {
        return isset($this->config[$key]) ? $this->config[$key] : '';
    }
}

test.php

<?php
require_once('../../../autoloader.php');
use com\wdqz\singleton\Config;

$config = Config::getInstance();
$config->setConfig('host', 'localhost');
echo $config->getConfig('host').PHP_EOL;
$config->setConfig('host', '127.0.0.1');
echo $config->getConfig('host').PHP_EOL;
作者:Wolf  创建时间:2023-11-19 18:31
最后编辑:Wolf  更新时间:2023-11-27 23:47