如何在PHP中使用依赖项注入?

如何在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,遇到了一个小问题。一位同事告诉我,最好使用依赖项注入,而不是继承数据库类。我想使用依赖注入,但我不知道如何使用。我试图在构造函数中使用,但出现了一个错误:

致命错误: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

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");