dtoqemais553654797 2012-08-23 11:15
浏览 75
已采纳

这会被认为是php / codeigniter中的依赖注入吗?

Would this be considered dependency injection?

<?php
class BASE_Model extends CI_Model 
{  
    /**
     * inject_class - load class using dependency injection
     *
     * @access public
     * @param  string $path
     * @param  string $class
     * @param  string $func
     * @param  string $method
     **/
    public function inject_class($path, $class, $func, $method)
    {
        // load_class is a function located in system/core/common.php on line 123
        $obj = load_class($class, $path, NULL);
        return $obj->$func();
    }
}

// lets say this is instantiated by a user controller when a new user is made
class User_model extends BASE_Model
{
    public function create()
    {
        echo 'create a new user';
        $request = $this->inject_class('path/to/models', 'Logger_model', 'log');
        echo $request;
    }
}

class Logger_model extends BASE_Model
{
    public function log()
    {
        return 'Logged';
    }
}
  • 写回答

1条回答 默认 最新

  • doudu7626 2012-08-23 11:21
    关注

    No. That's just another way of how the object loads dependencies itself. The point of dependency injection is that every method/object/function takes its dependencies as arguments and does not load them itself in any way. User_model::create is injecting loading another class by itself, which is not accepting the dependency as an argument.

    The point of dependency injection is to reduce coupling. The User_model is now coupled to the Logger_model class, since it hardcodes the name and path to that specific class inside itself. If you wanted to use or test the User_model by itself in isolation, without it logging stuff you don't want, you cannot do so anymore. Real DI would be this:

    public function create(Logger_model $log) {
        // here be dragons
        $log->log();
    }
    

    This way you can inject a mocked dummy logging class when you want to test the method without breaking anything or use alternative types of loggers when needed without needing to change any code.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog