我正在开发一个模型,我将拥有一个名为database
的父类。这将有直接在数据库上工作的方法。我将有一些其他类将扩展database
类以使用其功能(访问数据库)。但是,这些类需要定义自己的__construct
方法,database
类将以__construct
方法连接到数据库。
我的意思的一个示例如下,__construct
类的user
显式调用查询(仅当__construct
database
方法时才会生效已经调用过类)。
<?php
class database {
private $mysqli;
function __construct() {
$this -> mysqli = new mysqli(..login_details..);
}
public function query($query) {
return $this -> mysqli -> query($query);
}
}
class user extends database {
function __construct() {
$users = $this -> query("SELECT * FROM users");
while($u = $users -> fetch_assoc()) {
print_r($u);
}
}
}
$user = new user();
?>
它的一种方法是在子类中显式调用parent :: __constructor();
,但我不希望它为每个继承的类重新连接到数据库,即我只希望它在第一次连接时一个类继承它。我该怎么做呢?我是否必须在database
构造之外执行此操作?:
private static $mysqli = new mysqli(...);
或者我要以完全错误的方式实施我的模型?
答案 0 :(得分:1)
我会说依赖注入而不是继承。想想is a
关系继承通常意味着什么。例如,类cat
可以继承自类mammal
。这对于猫is a
哺乳动物来说是有道理的。
在你的情况下,这真的没有意义。当您实例化用户类时,可能会在构造函数中传入一个数据库对象。
class user{
private $DB = null;
function __construct(database $DB) {
$this->DB = $DB;
$users = $this -> DB -> query("SELECT * FROM users");
while($u = $users -> fetch_assoc()) {
print_r($u);
}
}
}
$DB = new database();
$user = new user($DB);
获得所需结果的方法不止一种,我认为这是一种更合适的方法。此外,您可以使用原始database
对象,而无需多次调用构造函数。