首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP __construct()

PHP __construct()
EN

Stack Overflow用户
提问于 2012-07-26 04:58:49
回答 4查看 14.5K关注 0票数 0

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

谢谢!

database.php

代码语言:javascript
复制
class db
{
  private $connection;

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

admin.php

代码语言:javascript
复制
class admin
{
  private $connection

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

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

main.php

代码语言:javascript
复制
//include db.php
//include admin.php

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

// How do I access the DB here?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-26 05:10:49

首先,为什么只将PDO封装到包含该对象的类中?不能直接使用PDO吗?

一种常见的做法是在db类中实现getter,例如:

代码语言:javascript
复制
class db {
    ...

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

另一种方法是重新实现每个函数(为什么要这样做?!),或者使用__call魔术函数……

或者只是将$connection公开;)

或者你可以扩展PDO类(我不确定它是否可以工作):

代码语言:javascript
复制
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->...
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-07-26 05:05:27

好的,你真的需要去阅读面向对象的设计和访问修饰符。我将在这里解释您需要做什么,但这是一个创可贴解决方案,您需要深入了解这里的工作原理。

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

在你的main.php文件中,你在初始化一个DB对象时得到的对象不是连接。作为一个整体,它是db对象,因此您不能将连接本身传递给admin类(它被定义为private,因此类之外的任何人都无法查看它)。但是,为什么需要将它传递给admin类呢?管理DB连接应该是DB类的职责。

换句话说,您试图通过向admin类公开DB连接来实现什么?

Upate:根据回复,这里有一个建议的答案:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
$admin = new Admin();
$admin->myFunc();

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-26 05:15:28

这个怎么样:更新

代码语言:javascript
复制
 <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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11658532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档