PHP依赖注入和从伞类扩展

时间:2014-02-21 17:03:23

标签: php class dependency-injection

我有一个数据库类,其中包含一系列函数,我被告知最好从另一个类中访问这些函数是依赖注入。我想要做的是有一个主类具有数据库依赖关系“注入”它,然后其他类扩展到这个类,如用户,帖子,页面等。

这是注入数据库依赖关系的主类。

class Main {

    protected $database;

    public function __construct(Database $db)
    {
        $this->database = $db;
    }
}

$database = new Database($database_host,$database_user,$database_password,$database_name);
$init = new Main($database);

然后这是我试图扩展它的Users类。

class Users extends Main {

    public function login() {

        System::redirect('login.php');

    }

    public function view($username) {

        $user = $this->database->findFirst('Users', 'username', $username);

        if($user) {
            print_r($user);
        } else {
            echo "User not found!";
        }

    }

}

但是每当试图为User类调用view函数时,我都会收到此错误致命错误:在不在对象上下文中时使用$ this 。此错误与尝试在Users类中调用$ this->数据库有关。我已经尝试初始化一个新的用户类并将数据库传递给它,但无济于事。

1 个答案:

答案 0 :(得分:0)

使用call_user_func_array并传递一个由类的字符串名称和类的方法的字符串名称组成的可调用对象时,它会进行静态调用:Class::method()。您需要先定义一个实例,然后将该实例作为callable的第一部分传递,如下所示:

class Test
{
    function testMethod($param)
    {
        var_dump(get_class($this));
    }
}

// This call fails as it will try and call the method statically
// Below is the akin of Test::testMethod()
// 'this' is not defined when calling a method statically
// call_user_func_array(array('Test', 'testMethod'), array(1));

// Calling with an instantiated instance is akin to $test->testMethod() thus 'this' will refer to your instnace
$test = new Test();
call_user_func_array(array($test, 'testMethod'), array(1));