0

我有以下内容,但是我无法访问初始 db 类之外的数据库函数?

谢谢!

数据库.php

class db
{
  private $connection;

  public function __construct()
  {
    $this->connection = new PDO();
  }
}

管理员.php

class admin
{
  private $connection

  public function __construct(db $connection)
  {
    $this->connection = $connection;
  }

  function myFunc()
  {
    // How do I access the connection here?
  }
}

主文件

//include db.php
//include admin.php

$connection = new db();
$admin = new admin($connection);

// How do I access the DB here?
4

4 回答 4

1

好的,您确实需要阅读面向对象的设计和访问修饰符。我将在这里解释你需要做什么,但这是一个临时解决方案,你需要深入了解这里的工作方式。

在您的管理类中,您将连接定义为类的私有属性。因此,在 myFunc 函数中,您只需执行 $this->connection 即可访问您在构造函数中创建的连接。

在您的 main.php 文件中,您正在初始化 DB 对象的 rom 对象不是连接。它是一个整体的db对象,所以你不能将连接本身传递给admin类(它被定义为私有,所以类外没有人可以查看它)。但是,为什么需要将它传递给管理类?管理 DB 连接应该是 DB 类的责任。

换句话说,你想通过将数据库连接暴露给管理类来实现什么?

更新:根据这里的回复是一个建议的答案:

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();

请记住,每个管理对象都会创建到数据库的新连接,因此如果您创建许多管理对象,您可能会遇到一些问题。您可以通过将数据库声明为单例来解决此问题。

于 2012-07-25T21:05:27.433 回答
1

首先,你为什么只封装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-25T21:10:48.920 回答
1

这个怎么样:已更新

 <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>
于 2012-07-25T21:15:28.417 回答
0

更新了文件分离

数据库.php

class db
{
    private $connection;

    public function __construct()
    {
        $this->connection = new PDO();
    }
}

管理员.php

class admin
{
    private $connection

    public function __construct(db $connection)
    {
        $this->connection = $connection;
    }

    function myFunc()
    {
        return $this->connection->prepare('SQL');
    }

    function getConnection()
    {
        return $this->connection;
    }
}

主文件

require_once 'database.php';
require_once 'admin.php';

$connection = new db();
$admin = new admin($connection);
$admin->myFunc()->execute();
于 2012-07-25T21:01:13.947 回答