1

我一直在强迫自己进入更多的 OOP。直到现在我都讨厌这一切。当我在另一个类中的 PDO 中使用一些简单的准备语句作为方法时,它永远不会起作用。我通过做显而易见的事情来解决它:将 PDO 对象全球化到方法中。它可以工作,并且可以满足我的要求-但是如果我有很多来自不同类的方法,请添加“global $db;” 作为所有功能/方法的第一行,它似乎很乏味。有没有办法将 PDO 集成到所有类中?或者至少是每个班级——而不是每一个血腥的方法?

这是一个非常简单的例子,说明当前的工作原理,但正如我所说的乏味:

<?php
 $db = new PDO("mysql:host=localhost;dbname=blaa;", "blaa", "blaa");
class test{

function show($col, $id){
    global $db;
    $result = $db->prepare("SELECT ".$col." FROM products WHERE id = :id");
    $result->execute(array("id"=>$id));
    $row = $result->fetch();
    echo $row[$col];
}
}

$show = new test();
$show->show("price", 1);
?>

..所以我可以在方法“show()”中使用我的 PDO,但如果我要添加另一种方法,我将不得不输入“global $db;” 又在里面……

那么我如何不只用一种方法将它全球化,而是用所有的类呢?我尝试将 PDO 类继承到“测试”类中,但没有奏效;我尝试使用如下构造函数:

<?php
$db = new PDO("mysql:host=localhost;dbname=blaa;", "blaa", "blaa");
class test{
    public $db;
function __construct($db){
           $this->db = $db;
    }
function show($col, $id){
    $result = $db->prepare("SELECT ".$col." FROM products WHERE id = :id");
    $result->execute(array("id"=>$id));
    $row = $result->fetch();
    echo $row[$col];
}
}

$show = new test($db);
$show->show("price", 1);
?>

但这没有用..

任何帮助,将不胜感激!

谢谢-怀利

4

2 回答 2

2
$this->db = $db;

表示你分配$db$this->db,而不是相反!

所以,你必须使用$this->db,而不是$db在你的课堂上

$result = $this->db->prepare("SELECT ".$col." FROM products WHERE id = :id");
于 2013-08-10T15:41:37.107 回答
1

“你的常识”是对的。但我想补充一点,您可以并且应该使用单例模式:创建一个类,其目的是维护与数据库的唯一连接。

class Database {
    private static $instance = null;

    private $pdo;
    private function __construct() {
        $this->pdo = new PDO("mysql:host=localhost;dbname=blaa;", "blaa", "blaa");
    }

    public static function get() {
        if(is_null(self::$instance))
            self::$instance = new Database();
        return self::$instance;
    }
}

然后,每次您需要访问数据库时,而不是将 PDO 对象存储为实例属性,您可以使用:

$db = Database::get();

您的示例将变为:

class test {
    function __construct() {
        // You don't need this anymore, unless you have other things to do in the constructor
    }

    function show($col, $id) {
        $db = Database::get();
        $result = $db->prepare("SELECT ".$col." FROM products WHERE id = :id");
        $result->execute(array("id"=>$id));
        $row = $result->fetch();
        echo $row[$col];
    }
}

如果您不想Database::get在需要它的每个方法中调用它,则可以在构造函数中执行一次。

class test {
    private $db;

    function __construct() {
        $this->db = Database::get();
    }

    function show($col, $id) {
        $result = $this->db->prepare("SELECT ".$col." FROM products WHERE id = :id");
        $result->execute(array("id"=>$id));
        $row = $result->fetch();
        echo $row[$col];
    }
}
于 2013-08-10T15:45:33.723 回答