我在PHP中编写了一个相当简单的数据库类,它支持最基本的东西,如连接/断开连接,查询,获取数据等。
我知道我在这里重新发明轮子,但这背后有一些学习方面。我已经测试过了,效果很好。现在我想把这个类用于我运行的网站,我知道在任何给定时间都有相当数量的同时用户,我发现自己对如何使用该类有些不确定。
每次要使用该类时,是否要创建新实例?假设我有一个函数列出了我的数据库,我会做这样的事情吗?:
function listStuff() {
$db = new Database();
$db->connect();
$result = $db->query($someQuery);
//do stuff with result
$db->dicsonnect();
}
这似乎在内存中创建了不必要的对象数量,那么我将如何重用对象但仍能够同时拥有用户呢?
谢谢!
答案 0 :(得分:4)
您应该using dependency injection。这将确保您的代码不仅易于阅读和测试,它将使您的功能(我希望在课堂上)可重用。
function listStuff(DatabaseClassInstance $db)
{
$result = $db->query($someQuery);
//do stuff with result
}
如果您使用的是MySQLi或PDO扩展,则在脚本结束时将终止$db
对象。
类型提示DatabaseClassInstance
不是必需的,但在这种情况下很好,以确保将正确的参数类型传递给函数。
答案 1 :(得分:0)
你不能在多个用户中使用单个实例。但对于单个用户,您可以通过将该对象的实例传递到称为注册表的中央存储库来防止不必要的实例化。
答案 2 :(得分:0)
严格地说,您不会为多个用户创建单个实例。每个构造Database对象的请求都会再次实例化它。
如果您主要是使用数据库检索用户信息,我建议您编写一个对象模型来代表您的用户。这个以及您的数据库类可以包含在全局范围中,同时调用session_start()以允许您在一个类接口中管理用户会话。当数据库管理的持久性包含在一些有意义的对象接口中时,对站点功能建模变得更加容易。
您可以编写一个基本类,该类具有利用您的数据库类并将查询提供给它的方法。
class User{
public function __construct($user_id){
//use your database class to find a user id and assign properties of the user data
//Then save to the session.
$_SESSION['user'] = $this;
}
public static function Login($username, $pass){
//use your database object to find the user id associated with the passed login creds, then construct it as a user using the above function;
}
public static function Logout(){
//remove any user in the session and restart the session
}
}
这种基于模型的代码通常可用于创建非常语义的方法名称,它可用于管理全局状态,例如数据库中的用户属性。当您开始编写包含连接和包含子项可以继承的数据的结构的抽象类时,它也会派上用场。
我遇到很多部署为单例的数据库类,只需要小部署,并且调用任何查询函数会创建访问持久连接,然后在请求结束时关闭它
答案 3 :(得分:-1)
global $db;
lorem ipsum dolor sit amet
function listStuff() {
global $db;
$result = $db->query($someQuery);
//do stuff with result
}