我一直在强迫自己进入更多的OOP。到目前为止,我一直讨厌这一切。当我在另一个类中使用PDO中的一些简单的准备语句作为方法时它永远不会起作用。我通过显而易见的方法解决了这个问题:将PDO对象全局化到方法中。它工作,并做我想要的 - 但如果我从不同类的负载有很多方法,添加“全球$ db;”作为alllll函数/方法的第一行似乎很乏味。有没有办法将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);
?>
但这不起作用..
任何帮助将不胜感激!
由于 -Wylie
答案 0 :(得分:2)
$this->db = $db;
表示您已将$db
分配给$this->db
,而不是相反!
所以,你必须在课堂上使用 $ this-&gt; db ,而不是$db
$result = $this->db->prepare("SELECT ".$col." FROM products WHERE id = :id");
答案 1 :(得分:0)
“你的常识”是对的。但我想补充一点,你可以而且应该使用单例模式:创建一个类,其目的是维护与数据库的唯一连接。
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];
}
}