我目前正在使用OOP和PDO编写我的第一个PHP应用程序。这样做我正在处理一个连接类,以便我可以在需要时启动数据库连接。我相信我这样做的条件是依赖注入。
我在尝试访问连接时遇到错误。
这是我的连接类:
class db{
private $host = '';
private $dbname = '';
private $username = '';
private $password ='';
public $con = '';
function __construct(){
$this->connect();
}
function connect(){
try{
$this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password);
$this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo 'We have a problem!';
}
}
}
这就是我试图在其他类中调用它的方式。
private $con;
public function __construct(db $con) {
$this->con = $con;
}
然而,这是我在尝试运行时收到的错误。
Catchable fatal error: Argument 1 passed to users::__construct() must be an instance of db, none given.
对我所做错误的建议不胜感激。
答案 0 :(得分:2)
您需要先创建数据库实例并将其传递给“其他”类的构造函数
$db = new DB();
$class = new OtherClass($db);
除此之外,还有其他问题:
DB类构造函数没有为数据库名称,用户和密码等赋值。一种方法是将这些设置传递给DB的构造函数,并将值分配给私有属性。
class DB{
private $host = '';
private $dbname = '';
private $username = '';
private $password ='';
public $con = '';
function __construct($host, $dbname, $username, $password){
$this->host = $host;
$this->dbname = $dbname;
$this->username = $username;
$this->password = $password;
$this->connect();
}
function connect(){
try{
$this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password);
$this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo 'We have a problem!';
}
}
}