如何在PHP中使用依赖项注入?
我刚开始学习面向对象的PHP,遇到了一个小问题。一位同事告诉我,最好使用依赖项注入,而不是继承数据库类。我想使用依赖注入,但我不知道如何使用。我试图在构造函数中使用,但出现了一个错误: 致命错误:Uncaught TypeError:传递给signIn::_构造必须是数据库的实例,给定数组,在第54行的C:\xampp\htdocs\messbox\index.php中调用,并在中定义 C:\xampp\htdocs\messbox\klasy\sign\u in.php:12 堆栈跟踪: 0 C:\xampp\htdocs\messbox\index.php54:signIn->\uu数组 在第12行的C:\xampp\htdocs\messbox\klasy\sign_in.php中抛出1{main} 我希望有人能向我解释如何正确使用它如何在PHP中使用依赖项注入?,php,dependency-injection,Php,Dependency Injection,我刚开始学习面向对象的PHP,遇到了一个小问题。一位同事告诉我,最好使用依赖项注入,而不是继承数据库类。我想使用依赖注入,但我不知道如何使用。我试图在构造函数中使用,但出现了一个错误: 致命错误:Uncaught TypeError:传递给signIn::_构造必须是数据库的实例,给定数组,在第54行的C:\xampp\htdocs\messbox\index.php中调用,并在中定义 C:\xampp\htdocs\messbox\klasy\sign\u in.php:12 堆栈跟踪: 0
<?php
class database {
private $servername = "localhost";
private $username = "root";
private $password = "";
private $dbname = "messbox";
public function connect() {
$this->servername = "localhost";
$this->username = "root";
$this->password = "";
$this->dbname = "messbox";
try {
$dsn = "mysql:host=" . $this->servername . ";dbname=" . $this->dbname;
$pdo = new PDO($dsn, $this->username, $this->password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
}
?>
您已经将数据库类注入到signIn类中
require_once('connect.php');
public function __construct(database $database) {
$this->database = $database;
}
但是错误是由以下代码引起的
$sql = $this->connect()->prepare("SELECT * FROM users where login = :login");
您应该使用$this->database来引用connect函数
欢迎来到堆栈溢出。我建议你阅读一些创建一个好问题的指南。声明弹出的错误是模糊的-包括确切的错误,包括文件和行,建议我们识别该行。这样我们就可以更快地识别错误。综上所述,您似乎需要更多地了解对象是如何工作的。您尝试使用$sql=$this->connect->prepare….进行连接。。。。您的signIn类没有通过注入继承connect方法。您需要通过调用$this->database->connect来使用注入数据库实例的属性。任何时候你需要使用这个类中的东西,你都可以通过$this->database.sidenote,在StudlyCaps中声明你的类名,在中阅读所有关于这个和更多的内容。我更改了它,但现在显示错误:致命错误:未捕获错误:调用C:\xampp\htdocs\messbox\klasy\sign_in.php中的空成员函数connect:41堆栈跟踪:0 C:\xampp\htdocs\messbox\index.php57:sign->ifexist 1{main}在第41行的C:\xampp\htdocs\messbox\klasy\sign\u in.php中抛出,现在您已经了解了为什么方法链接与代码外的状态绑定时是不好的。连接方法失败。
$sql = $this->connect()->prepare("SELECT * FROM users where login = :login");
$sql = $this->database->connect()->prepare("SELECT * FROM users where login = :login");