我有一个关于在我的网站上的其他类中使用我的数据库类的问题。我只需要我的数据库类的一个对象,这是我想要运行所有查询的实例。
我有一个名为MysqliExtension的类,它扩展并为mysqli类增加了一些额外的功能 我还有一个名为Users的类,它管理我的用户登录/注销,从数据库中提取他们的信息等。 最后,我有一个名为config.php的文件,其中包含这两个类并实例化MysqliExtension和User类的对象。
的config.php
require_once 'MysqliExtension.php';
require_once 'Users.php';
$database = new MysqliExtension(host,....);
我想就将数据库对象传递给User对象的最佳方法获得一些意见。
在我的config.php文件中
$user = new User($username,password);
在我的Users.php文件中
class User{
function myfunction(){
global $database;
$database->callDatabaseFunction();
return $some_result;
}
}
}
在我的config.php文件中
$user = new User($username,password,$database);
在我的Users.php文件中
class User{
function __construct($username,$password,$database){
$this->database = $database;
}
function myfunction(){
$this->database->callDatabaseFunction();
return $some_result;
}
}
}
哪种方式最好,还是几乎相同?是否有一种不同的方式,我还没有想到?
答案 0 :(得分:2)
如果您只需要一个班级的一个实例:http://en.wikipedia.org/wiki/Singleton_pattern
用法示例(使用引用链接中的PHP示例):
$instance = Singleton::getInstance();
// or
Singleton::getInstance()->somefunction();
请注意,此方法仅允许该对象的一个实例,因此如果您需要使用多个(假设有两个连接到不同的数据库),则最好不要使用它。
答案 1 :(得分:1)
我更喜欢第一种方式。使数据库逻辑与用户逻辑完全分离更有意义。但是,如果您将这些功能公之于众,您可以执行以下操作:
$user_results = database::callDatabaseFunction()
无需实例化对象。