php实现控制反转(IOC),依赖注入(DI)实例

作者: wxfeng 分类: php 发布时间: 2022-02-16 16:14    阅读 1,763 次

需求:

用户登录需要提供记录日志的功能,可以选择使用文件或者数据库。

未实现之前的代码

// 定义写日志的接口规范
interface Log
{
    public function write();   
}

// 文件记录日志
class FileLog implements Log
{
    public function write(){
        echo 'file log write...';
    }   
}


// 数据库记录日志
class DatabaseLog implements Log
{
    public function write(){
        echo 'database log write...';
    }   
}

// 程序操作类
class User 
{
    protected $fileLog;

    public function __construct()
    {
        $this->fileLog = new FileLog();   
    }

    public function login()
    {
        // 登录成功,记录登录日志
        echo 'login success...';
        $this->fileLog->write();
    }

}

$user = new User();
$user->login();

上面的写法可以实现记录日志的功能,但是有一个问题,假设现在想用数据库记录日志的话,我们就得修改 User 类,这份代码没达到解耦合,也不符合编程开放封闭原则(OCP,Open Closed Principle),那如何修改呢?我们可以把日志处理类通过构造函数方式传递进去。下面我们试着修改 User 类的代码。

实现之后的代码

<?php
// 定义写日志的接口规范
interface Log
{
    public function write();
}

// 文件记录日志
class FileLog implements Log
{
    public function write()
    {
        echo 'file log write...';
    }
}


// 数据库记录日志
class DatabaseLog implements Log
{
    public function write()
    {
        echo 'database log write...';
    }
}

// 程序操作类
class User
{
    protected $log;

    //通过构造函数实现依赖注入(DI)
    public function __construct(Log $log)
    {
        $this->log = $log;
    }
    public function login()
    {
        echo 'login success...';
        $this->log->write();
    }
}
//通过传递Log对象达到控制反转(IOC)的目的
$user = new User(new DatabaseLog());
$user->login();

原文作者:cxp1539
转自链接:https://learnku.com/docs/laravel-core-concept/5.5/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5,%E6%8E%A7%E5%88%B6%E7%BF%BB%E8%BD%AC,%E5%8F%8D%E5%B0%84/3017#adc09d
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。