简单实现容器和单例模式

定义容器

class SimpleContainer
{
    protected $bindings = [];
    protected $instances = [];

    public function bind($key, $value, $singleton = false)
    {
        $this->bindings[$key] = $value;
        if ($singleton) {
            $this->instances[$key] = null;
        }
    }

    /**
     * @throws Exception
     */
    public function make($key)
    {
        if (!isset($this->bindings[$key])) {
            throw new Exception("No binding found for $key");
        }

        if (isset($this->instances[$key]) && $this->instances[$key] !== null) {
            return $this->instances[$key];
        }

        $instance = call_user_func($this->bindings[$key], $this);
        if (array_key_exists($key, $this->instances)) {
            $this->instances[$key] = $instance;
        }

        return $instance;
    }
}

interface LoggerInterface
{
    public function log($message);

    public function error($message);
}

class Logger implements LoggerInterface
{
    public function log($message)
    {
        echo "Logging message: $message\n";
    }

    public function error($message)
    {
        echo "Logger error:$message";
    }
}

class Logger2 implements LoggerInterface
{
    public function log($message)
    {
        echo "Logger2 Logging message: $message\n";
    }

    public function error($message)
    {
        echo "Logger2 error:$message";
    }
}

运行代码

$container = new SimpleContainer();
$container->bind("Logger", function () {
    return new Logger();
}, true);

try {
    $logger = $container->make("Logger");
    $logger2 = $container->make("Logger");
    $logger3 = $container->make("Logger");
    $logger4 = $container->make("Logger");
    if ($logger === $logger2) {
        echo "相同的实例\n";
    } else {
        echo "不同的实例\n";
    }
    $logger->error("测试信息 error");
} catch (Exception $e) {
    echo $e->getMessage();
}

运行结果

简单实现容器和单例模式

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!