这种写法的劣势在哪,是不是个人习惯

<?php
interface Log {
    public function write();
}

Class FileLog implements Log{
    public function write() {
        echo "文件记录日志";
    }
}

Class DatabaseLog implements Log{
    public function write() {
        echo "数据库记录日志";
    }
}

Class User {
    public function login(Log $log) {
        echo "登录成功";
        $log->write();
    }
}

$user = new User();
$user->login(new DatabaseLog());
你的代码应该是写给下一个开发者的情书。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 17

控制反转,内部服务由外部提供,降低耦合

2年前 评论

劣势就是要写的代码更多了...

2年前 评论

接口编程的坏处

  1. IDE代码跳转不方便, 需要去看依赖找实现类
  2. 容易过度设计,让本来清晰的逻辑复杂化
2年前 评论
九霄道长

@cvoid 确实更依赖与现实需求,经常变动的业务层不适合,那些 支付,oss,短信之类的可以

2年前 评论

@Nines 我自己认为抽象的优势在于无限横向扩展,相同情况不同实现。 但是我自己在写业务的时候发现需求逻辑多变情况一直在变化,抽象反而在肘制自己。

在某些功能需求十分明确的情况下代码会比直接实现清晰很多 类似支付登录分享之类。

这是我目前的理解,抽象不是万金油,只是有适用场景。

2年前 评论

基于接口的开发 这种比较适合于 后期会换不同实现方式或者直接替换的 需求,主流程不变 而需要改变的仅仅是具体的实现方式而已! 优势就是 替换具体的实现类 简单方便 ,缺点就是代码量上去了 容易过度设计!

2年前 评论

方便切换实现方式吧

2年前 评论
KayuHo

我觉得是一样,注入的时机不同而已

2年前 评论

之后如果想用另一种方式记录日志,可以很方便地切换。

2年前 评论
九霄道长

@cvoid 复杂的项目基于接口反而更清晰,更灵活吧

2年前 评论

从长远的角度考虑,后期比较没有bug

2年前 评论

码农的人习惯问题,对服务器来说没什么特别的,都是0/1在跑。 :joy:

2年前 评论
九霄道长

基于接口,而非实现编程

2年前 评论

补充一下,是跟这种写法比较,他俩是不是一样的 :sweat_smile:

class User 
{
    protected $log;

    public function __construct(Log $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
       public function login(Log $log) {
          echo "登录成功";
            $this->log->write();
       }   
    }
}

$user = new User(new DatabaseLog());
$user->login();
2年前 评论

哪天admin login的时候需要用到 FileLog 并且user login要保持DatabaseLog

2年前 评论
LW_aravel 2年前
巴啦啦

挺好啊,没啥劣势吧

2年前 评论

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