我收到错误
调用未定义的方法Connection :: prepare()
错误源自QueryBuilder类的select4方法(如下所示)。调用prepare方法的第一行。
理想情况下,Connection类应该将PDO对象返回给QueryBuilder。 好像我将Connection对象实例传递给了QueryBuilder。
私人$ pdo的var_dump输出
object(QueryBuilder)#4 (1) {
["pdo":"QueryBuilder":private]=> object(Connection)#2 (0) { } }
object(Connection)#2 (0) { }
代码说明
我有一个配置类(不包括在内),它接受一个json文件(mysql连接信息)并返回一个数组。
然后传递给Connection类以返回一个新的PDO对象
class Connection {
public function __construct($db) {
$dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];
return new PDO($dsn, $db['user'], $db['pwd']);
}
}
QueryBuilder类接受PDO实例并将其存储在私有变量上。
class QueryBuilder {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
}
public function select4($sql) {
$statement = $this->pdo->prepare(":sql :n");
$statement->bindValue(n, 4, PDO::PARAM_INT);
$statement->execute(['sql' => $sql]);
return $statement->fetch(PDO::FETCH_CLASS);
}
}
从Config类
调用Connection传递数组值的新实例$pdo = new Connection(Config::getInstance()->get("db"));
调用QueryBuilder的新实例,从Connection
传递PDO实例$query = new QueryBuilder($pdo);
$sql_1 = 'SELECT title, synopsis FROM blog LIMIT';
$blog = $query->select4($sql_1); // triggers error
更新:
感谢您的评论和帮助。我更改了Connection类以实现公共静态变量$ pdo。我使用构造函数将PDO对象分配给静态变量。
class Connection {
public static $pdo; // Added a static $pdo
public function __construct($db) {
$dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];
self::$pdo = new PDO($dsn, $db['user'], $db['pwd']); // assign PDO
}
}
$pdo = new Connection(Config::getInstance()->get("db"));
$query = new QueryBuilder(Connection::$pdo);
纠正了select4方法中的一些小错误及其现在的工作。 :)
答案 0 :(得分:2)
理想情况下,Connection类应该将PDO对象返回给QueryBuilder。好像我将Connection对象实例传递给了QueryBuilder。
使用构造函数无法实现,在构造函数中返回不同的对象不会影响new
语句返回的内容。请参阅:Constructor returning value?。
您可以尝试以下方法之一:
<强>继承强>
class Connection extends PDO {
public function __construct($db) {
$dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];
parent::__construct($dsn, $db['user'], $db['pwd']);
}
}
使用:
// Get Connection object which extends PDO class
$pdo = new Connection(Config::getInstance()->get("db"));
静态方法
class Connection {
public static function getPDO($db) {
$dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];
return new PDO($dsn, $db['user'], $db['pwd']);
}
}
使用:
// Get PDO object using Connection static method
$pdo = Connection::getPDO(Config::getInstance()->get("db"));
Getter方法
class Connection {
/** @var PDO */
private $pdo;
public function __construct($db) {
$dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];
$this->pdo = new PDO($dsn, $db['user'], $db['pwd']);
}
/**
* Get PDO instance
* @return PDO
*/
public function getPDO() {
return $this->pdo;
}
}
使用:
// Get PDO object using Connection object
$pdo = (new Connection(Config::getInstance()->get("db")))->getPDO();
你应该定义一些mysql包装器,比如Laravel的数据库包装器:https://github.com/illuminate/database。使用经过检查的解决方案通常比重新发明轮子更好。