新手开发者:) 我试图第一次实现依赖注入。 我创建了与数据库连接的类:
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
有人可以帮助我吗?
答案 0 :(得分:0)
你不应该包装PDO。 PDO本身具有您使用它所需的一切。在这种情况下,致命错误是因为您尝试在prepare()
上调用$this->pdo
函数,就像它是PDO实例一样,但它不是,因为您将其包装成(无用的)PDOClass
包装。
解决方案非常简单:删除包装器并直接将pdo对象传递给需要它的类。这就是依赖注入的含义。