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

时间:2012-08-23 11:15:05

标签: php oop codeigniter design-patterns

这会被视为依赖注入吗?

<?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 个答案:

答案 0 :(得分:4)

没有。这只是对象本身如何加载依赖关系的另一种方式。依赖注入的要点是每个方法/对象/函数都将其依赖关系作为参数,并且以任何方式加载它们自己。 User_model::create注入自己加载另一个类,它不是接受依赖作为参数

依赖注入点是减少耦合。 User_model现在已耦合到Logger_model类,因为它将名称和路径硬编码到其内部的特定类中。如果您想单独使用或测试User_model,而不记录您不想要的内容,则不能再这样做了。真正的DI就是这样:

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

这样,当您想要在不破坏任何内容的情况下测试方法或在需要时使用其他类型的记录器而无需更改任何代码时,您可以注入模拟的虚拟日志记录类。