我有以下内容,但是我无法访问初始db类之外的数据库函数?
谢谢!
database.php
class db
{
private $connection;
public function __construct()
{
$this->connection = new PDO();
}
}admin.php
class admin
{
private $connection
public function __construct(db $connection)
{
$this->connection = $connection;
}
function myFunc()
{
// How do I access the connection here?
}
}main.php
//include db.php
//include admin.php
$connection = new db();
$admin = new admin($connection);
// How do I access the DB here?发布于 2012-07-26 05:10:49
首先,为什么只将PDO封装到包含该对象的类中?不能直接使用PDO吗?
一种常见的做法是在db类中实现getter,例如:
class db {
...
public function getPDO(){
return $this->connection;
}
}另一种方法是重新实现每个函数(为什么要这样做?!),或者使用__call魔术函数……
或者只是将$connection公开;)
或者你可以扩展PDO类(我不确定它是否可以工作):
class DB extends PDO {
public function __construct ( $dsn, $username = null, $password = null, $driver_options = array()){
parent::__construct( $dsn, $username, $password, $driver_options);
... more of your stuff
}
public function myFunc(){
$this->...
}
}发布于 2012-07-26 05:05:27
好的,你真的需要去阅读面向对象的设计和访问修饰符。我将在这里解释您需要做什么,但这是一个创可贴解决方案,您需要深入了解这里的工作原理。
在admin类中,您将连接定义为该类的私有属性。因此,在myFunc函数中,您只需执行$this->连接即可访问在构造函数中创建的连接。
在你的main.php文件中,你在初始化一个DB对象时得到的对象不是连接。作为一个整体,它是db对象,因此您不能将连接本身传递给admin类(它被定义为private,因此类之外的任何人都无法查看它)。但是,为什么需要将它传递给admin类呢?管理DB连接应该是DB类的职责。
换句话说,您试图通过向admin类公开DB连接来实现什么?
Upate:根据回复,这里有一个建议的答案:
class Database {
private $connection;
public function __construct() {
$this->connection = new PDO();
}
}
class Admin {
private $db;
public function __construct() {
$this->db = new Database();
}
public function myFunc() {
$this->db->query('...');
}
}在main.php文件中:
$admin = new Admin();
$admin->myFunc();请记住,每个管理对象都将创建一个到数据库的新连接,因此,如果您创建了许多管理对象,您可能会面临一些问题。您可以通过将DB声明为单例来解决此问题。
发布于 2012-07-26 05:15:28
这个怎么样:更新
<pre>
<?php
class DB {
private $host;
private $user;
private $pass;
private $dbase;
private $connection;
public function __construct($host,$user,$pass,$dbase)
{
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->dbase = $dbase;
$this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbase", $this->user, $this->pass);
}
public function connect()
{
return $this->connection;
}
public function close()
{
unset($this->connection);
return true;
}
}
$dbh = new DB('localhost','root','','inventory');
$result = $dbh->connect()->query("SELECT * FROM products")->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
?>
</pre>https://stackoverflow.com/questions/11658532
复制相似问题