Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中正确使用数据库类?_Php_Database_Oop_Class - Fatal编程技术网

在PHP中正确使用数据库类?

在PHP中正确使用数据库类?,php,database,oop,class,Php,Database,Oop,Class,我用PHP编写了一个相当简单的数据库类,它支持最基本的功能,如连接/断开连接、查询、获取数据等 我知道我正在重新发明轮子,但这背后有一些学习方面。我已经测试过了,效果很好。现在我想将这个类用于我运行的一个网站,我知道在任何给定时间都有相当数量的同时用户,我发现自己对如何使用这个类有些不确定 是否每次要使用该类时都要创建一个新实例?假设我有一个函数,它列出了我在数据库中看到的内容,我是否可以这样做 function listStuff() { $db = new Database();

我用PHP编写了一个相当简单的数据库类,它支持最基本的功能,如连接/断开连接、查询、获取数据等

我知道我正在重新发明轮子,但这背后有一些学习方面。我已经测试过了,效果很好。现在我想将这个类用于我运行的一个网站,我知道在任何给定时间都有相当数量的同时用户,我发现自己对如何使用这个类有些不确定

是否每次要使用该类时都要创建一个新实例?假设我有一个函数,它列出了我在数据库中看到的内容,我是否可以这样做

function listStuff() {
    $db = new Database();
    $db->connect();
    $result = $db->query($someQuery);
    //do stuff with result
    $db->dicsonnect();
}
这似乎会在内存中创建大量不必要的对象,那么我应该如何重用对象,但仍然能够同时拥有用户呢

谢谢

global $db;
lorem ipsum dolor sit amet

function listStuff() {
    global $db;
    $result = $db->query($someQuery);
    //do stuff with result
}

您不能跨多个用户使用单个实例。但是对于单个用户,您可以通过将该对象的实例传递到称为registry的中央存储库来防止不必要的实例化。

严格来说,您不会为多个用户创建单个实例。构造数据库对象的每个请求都会再次实例化它

如果主要是利用数据库检索用户信息,我建议编写一个对象模型来表示用户。这个类以及您的数据库类可以包括在全局范围中,同时调用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
  }
}
这种基于模型的代码对于创建非常语义化的方法名称非常有用,并且对于管理全局状态(例如数据库中的用户属性)也非常有用。当您开始编写抽象类时,它也很有用,这些抽象类包含子级可以从中继承的数据的连接性和结构

我遇到过很多数据库类,当需要进行小规模部署时,这些数据库类被部署为单例,对它们的任何查询函数的调用都会创建一个持久连接,然后在请求结束时将其关闭。

您应该这样做。这将确保您的代码不仅易于阅读和测试,还将使您的函数(我希望是在类中)可重用

function listStuff(DatabaseClassInstance $db) 
{
    $result = $db->query($someQuery);

    //do stuff with result
}
如果使用MySQLi或PDO扩展,脚本结束时,
$db
对象将终止


暗示DatabaseClassInstance的类型不是必需的,但在这种情况下很好,可以确保将正确的参数类型传递到函数中。

global$db$db=新数据库()$db->connect();函数listStuff(){$result=$db->query($someQuery);//使用result执行stuff}$db->dicsonnect()这不会导致同步问题吗?假设一个用户1正在进行连接,然后执行查询,但是在连接和查询之间,用户2正在进行断开连接。或者我遗漏了什么?globals是邪恶的,不应该被使用,特别是在这个上下文中,只是顺其自然@Slim不,每个用户都有自己的连接,100个用户,100个连接,你的例子会让100个用户有X个连接。您不需要断开连接。@Slim:每个页面请求都会启动一个不同的PHP进程。它们之间不共享任何对象。因此,没有两个用户影响彼此的对象实例。请避免自己创建内容。不要重新发明轮子。使用一个框架,zend,yii,sphmyfony@yes123避免在自己的xD上创建东西,如果他不知道自己在做什么,他就不应该创建它。Kohana FTW.+1 as依赖注入是相对于使用全局依赖注入的最佳方式。另外,@Slim你并不是真的在重新发明轮子。在我的工作中,我们还使用了一个DB类来处理主/从连接以及辅助函数,如按第一行查询、按id查询以及标准查询对象和数组,等等。使用预先存在的框架确实可行,但您需要知道您正在使用它们做什么,而且大多数时候,您还需要大量的软件包来使用它们的数据库类,这会增加比您可能想要或需要的更多的开销。