【问题标题】:PHP - Passing DB Connection to Various ClassesPHP - 将数据库连接传递给各种类
【发布时间】:2012-08-02 17:20:38
【问题描述】:

我有一个包含许多类的 PHP 项目,以及我从网上下载的一个 PDO Wrapper 类,看起来不错:

http://code.google.com/p/php-pdo-wrapper-class/

我的课程现在是这样的:

class product {
__constructor($id = 0) {
//mysql_query and store the product row in $this->row;
}

edit($array) {
//another obvious mysql_query...
}

所以它们非常简单,我想将所有 mysql_query 移动到 PDO 以确保安全。我有变量:

$db = new pdo('localhost', 'user', 'pass');

在我的包含文件的第一行中,在类之前正确定义了工作。但是,我不想写:

global $db;

在每个函数的开头。我考虑将 __construct() 函数更改为更像:

__construct($id = 0, $db = null) {
$this->db = $db;
}

然后从那里引用,但问题是我必须更改整个网站中的每个构造函数。有没有办法解决这个问题,使我能够对现有代码进行最少的编辑?

【问题讨论】:

    标签: php oop class pdo


    【解决方案1】:

    让你的所有模型类都继承自一个模型基类,然后在你的基类中定义一个静态变量$db,并在继承的类中使用它。

    class BaseModel {
      public static $db = NULL;
    }
    
    class UserModel extends BaseModel {
      public function create() {
        echo "Use the static variable: " . static::$db . "\n";
      }
    }
    
    BaseModel::$db = "new PDO object";
    UserModel::create();
    

    输出

    Use the static variable: new PDO object
    

    【讨论】:

    • 不比全局变量好
    • 从某种意义上说,你不必在每个函数内部都说global $db 更好,而且它只是在 BaseModel 及其后代中而不是在任何地方都是“全局的”。
    • 这看起来更好,因为我只需要创建一个很小的“BaseModel”类,然后在十个类文件的末尾键入“extends BaseModel”,这将使它在我更改时基本上向后兼容所有数据库调用完毕。谢谢!
    【解决方案2】:

    正如您所说,有一个 PDO 类,因此您可以轻松地在每个其他类中创建 PDO 类的实例。 首先在您需要的任何地方包含 PDO 类

    require_once'/PDOclass.php';
    

    然后创建实例

    $a=new PDAclass;
    

    【讨论】:

      【解决方案3】:

      你说 $db 是在你的包含文件中定义的。所以只需包含该文件,您就可以访问该参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多