PHP依赖注入 - 致命错误

时间:2017-01-17 15:45:58

标签: php mysql oop pdo dependency-injection

新手开发者:) 我试图第一次实现依赖注入。 我创建了与数据库连接的类:

public interface CachedRequestKey<T>{
    public T complexKeyObject;

    @Override
    public boolean equals(T obj);

}

我的index.php文件:

<?php

class PDOClass
{
  public function __construct($db, $host, $dbname, $port, $login, $password)
  {
    try
    {
       $this->pdo = new PDO($db.':host='.$host.';dbname='.$dbname.';port='. $port, $login, $password);
       $this->pdo-> query ('SET NAMES utf8');
       $this->pdo-> query ('SET CHARACTER_SET utf8_polish_ci'); 
       $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
       echo "<span style='color: red;'><strong>A database connection could not be established, try again later</strong></span><br>" . $e->getMessage();
    }
    echo "Works";
  }
}

这是我的LoginClass发生错误:

<?php
 require_once 'config.php';
 require_once 'pdoclass.php';
 require_once 'loginclass.php';

 require_once 'lib/Twig/Autoloader.php';
 Twig_Autoloader::register();
 $loader = new Twig_Loader_Filesystem('views');
 $twig = new Twig_Environment($loader);

 $pdo = New PDOClass($db, $host, $dbname, $port, $login, $password);
 $login = New LoginClass($pdo, $twig);

当我调用方法log()时它工作正常 - 它渲染了twig模板,但是当我想调用方法check()时,我遇到了致命的错误:

<?php
class LoginClass
{
  function __construct($pdo, $twig)
  {
    $this->pdo = $pdo;
    $this->twig = $twig;
  }

  public function log()
  {
     return $this->twig->render('logform.html.twig');
  }

  public function check($email, $password)
  {
     $stmt = $this->pdo->prepare('SELECT * FROM accounts WHERE email = :email AND password = :password');
     $stmt->bindParam(':email', $email);
     $stmt->bindParam(':password', $password);
     $stmt->execute();
  }
}

第19行是:

Fatal error: Call to a member function prepare() on null in E:\xampp\htdocs\test\loginclass.php on line 19

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

你不应该包装PDO。 PDO本身具有您使用它所需的一切。在这种情况下,致命错误是因为您尝试在prepare()上调用$this->pdo函数,就像它是PDO实例一样,但它不是,因为您将其包装成(无用的)PDOClass包装。

解决方案非常简单:删除包装器并直接将pdo对象传递给需要它的类。这就是依赖注入的含义。