简单实现容器和单例模式
定义容器
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 协议》,转载必须注明作者和本文链接