【问题标题】:Creating new class with external database class使用外部数据库类创建新类
【发布时间】: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 类,互相扩展了之前的

标签: php mysql oop


【解决方案1】:

解决此问题的最简单方法是环绕 $mysqli 实例。

定义StockUpdater类(建议类名首字母大写)

class StockUpdater {
    private $mysqli;

    public function __construct($mysqli) {
        $this->mysqli = $mysqli;
    }

    public function doStuff() {
        // do stuff with $this->mysqli
    }
}

并像使用它

require_once('dbconnector.php');

$su = new StockUpdater($mysqli);
$su->doStuff();

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多