【发布时间】:2013-04-04 21:39:30
【问题描述】:
我只是在创建一个简单的独立股票更新程序并将我的手转向 OOP,而不仅仅是基于函数。我创建了一个简单的类,它需要我的数据库连接,但想知道包含和使用数据库连接的最佳实践。第一个应用是将使用数据库的类。第二个是'dbconnector.php'的内容。
class stockUpdater {
var $data = '';
function __construct() {
include('dbconnector.php');
print_r($mysqli);
//check and get file
$fp = fopen('stockfiles/stockfile.csv', 'r');
if($fp){
while(! feof($fp)) {
$prods[] = fgetcsv($fp);
}
}
if(empty($prods)){
$this->logError(time(),'No data found in file');
}
}
//error logging function
private function logError($time, $message){
}
}
$updateStock = new stockUpdater();
我知道我在这里所做的工作,但不知道是否有比在每个类中包含数据库连接脚本更好的方法,因为这可能会在只需要 1 个时创建多个数据库连接。
$mysqli = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
/*
* This is the "official" OO way to do it,
* BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
*/
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
/*
* Use this instead of $connect_error if you need to ensure
* compatibility with PHP versions prior to 5.2.9 and 5.3.0.
*/
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
【问题讨论】:
-
我认为你应该在实例化类时调用 dbconnector。类的概念是通用的——所以每次你需要不同的连接时,你调用不同的 dbconnector 并实例化同一个类的新对象。
-
你能举个例子吗?不是 100% 确定我明白你的意思
-
最简单的例子:
public function __construct($conn) { include (' ' . $conn . ' '); ...;$conn = 'dbconnector.php'; $a = new stockUpdater($conn);... ; ...$conn2 = 'dbconn2.php'; $b = new stockUpdater($conn2);... 所以从 stockUpdater() 实例化对象为 $a 将与 dbconnector.php 连接,但在 $b 上实例化的同一类将与 dbconn2.php 连接 -
你应该通过注入依赖来做到这一点。有点像here。
-
但是当我再次阅读您的帖子时,它只解决了不同类的问题的一半。你可以尝试不同的方式。使您的 dbconnector 成为一个类,该类通过构造函数接收参数(主机、用户、传递等),然后是类的家族树。最主要的类扩展了你的 DbConnector 类,互相扩展了之前的