假设有一个小明类,他每天都需要干这三件事。

    1. <?php
    2. class Ming extends Person
    3. {
    4. private $_name;
    5. private $_age;
    6. function read(){
    7. //逛
    8. }
    9. function play(){
    10. //玩游戏
    11. }
    12. function grab(){
    13. //抢红包
    14. }
    15. }

    小明是一个人类,他没有办法仅靠自己实现以上功能,他必须依赖一部手机。

    1. <?php
    2. class iPhone6 extends Iphone
    3. {
    4. function read($user="某人")
    5. {
    6. echo $user."打开了记事本 \n";
    7. }
    8. function play($user="某人")
    9. {
    10. echo $user."打开了游戏 \n";
    11. }
    12. function grab($user="某人")
    13. {
    14. echo $user."开始抢红包 \n";
    15. }
    16. }

    小明直接拥有iphone6,实现以上功能:

    1. <?php
    2. class Ming extends Person
    3. {
    4. private $_name;
    5. private $_age;
    6. public function __construct()
    7. {
    8. $this->_name = '小明';
    9. $this->_age = 26;
    10. }
    11. function read()
    12. {
    13. //…… 省略若干代码
    14. (new iPhone6())->read($this->_name); //逛
    15. }
    16. function play()
    17. {
    18. //…… 省略若干代码
    19. (new iPhone6())->play($this->_name);//玩游戏
    20. }
    21. function grab()
    22. {
    23. //…… 省略若干代码
    24. (new iPhone6())->grab($this->_name);//抢红包
    25. }
    26. }
    27. //具体实现
    28. $ming = new Ming(); //实例化小明
    29. $ming->read();
    30. $ming->play();
    31. $ming->grab();

    会发现,若小明更换了一个新手机则需要对小明所有方法实现进行修改,所以引入依赖注入的形式修改小明类:

    1. <?php
    2. class Ming extends Person
    3. {
    4. private $_name;
    5. private $_age;
    6. private $_phone; //将手机作为自己的成员变量
    7. public function __construct($phone)
    8. {
    9. $this->_name = '小明';
    10. $this->_age = 26;
    11. $this->_phone = $phone;
    12. echo "小明起床了 \n";
    13. }
    14. function read()
    15. {
    16. //…… 省略若干代码
    17. $this->_phone->read($this->_name); //逛
    18. }
    19. function play()
    20. {
    21. //…… 省略若干代码
    22. $this->_phone->play($this->_name);//玩游戏
    23. }
    24. function grab()
    25. {
    26. //…… 省略若干代码
    27. $this->_phone->grab($this->_name);//抢红包
    28. }
    29. }
    30. //具体实现
    31. $phone = new Iphone6();
    32. $ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
    33. $ming->read();
    34. $ming->play();
    35. $ming->grab();

    现有项目控制器对模型的操作可修改为依赖注入的形式:

    1. <?php
    2. class BaseController extends Controller
    3. {
    4. //模型
    5. private $model;
    6. //接收数据
    7. private static $input;
    8. //模型具体路径
    9. const MODEL_ROUTE = 'app\\models\\';
    10. //构造方法
    11. public function init()
    12. {
    13. parent::init();
    14. //处理response对象
    15. if (empty(static::$input)) {
    16. static::$input = input('post.');
    17. }
    18. //反射模型对象
    19. $CLASS_NAME = self::MODEL_ROUTE. parse_name(strtr($this->id, '-', '_'), 1);
    20. if (class_exists($CLASS_NAME)) {
    21. $this->model = (new \ReflectionClass($CLASS_NAME))->newInstanceArgs([static::$input]);
    22. }
    23. }
    24. /**
    25. * 查询列表数据(含分页)
    26. * @return array
    27. */
    28. public function actionList(): array
    29. {
    30. return $this->model->getLists();
    31. }
    32. /**
    33. * 查询数据详情
    34. * @return array
    35. */
    36. public function actionRead(): array
    37. {
    38. return $this->model->getOne();
    39. }
    40. /**
    41. * 创建数据
    42. * @return array
    43. */
    44. public function actionCreate(): array
    45. {
    46. return $this->model->addOne();
    47. }
    48. /**
    49. * 更新数据
    50. * @return array
    51. */
    52. public function actionUpdate(): array
    53. {
    54. return $this->model->editOne();
    55. }
    56. }