0

私は次のものを持っていますが、最初の db クラス以外のデータベース関数にアクセスできませんか?

ありがとう!

データベース.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?
4

4 に答える 4

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 に答える
1

まず、PDOその 1 つのオブジェクトを含むクラスだけにカプセル化するのはなぜですか? PDO直接使えない?

一般的な方法の 1 つは、次のように 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

よし、オブジェクト指向設計とアクセス修飾子についてよく読んでおく必要がある。ここで何をする必要があるかを説明しますが、これは一時的な解決策であり、ここでどのように機能しているかを深く理解する必要があります。

管理クラスで、接続をクラスのプライベート属性として定義しました。したがって、myFunc 関数では、単純に $this->connection を実行して、コンストラクターで作成した接続にアクセスします。

main.php ファイルでは、DB オブジェクトの初期化で取得するオブジェクトは接続ではありません。これは全体として db オブジェクトであるため、接続自体を管理クラスに渡すことはできません (プライベートとして定義されているため、クラス外の誰も表示できません)。しかし、なぜそれを管理者クラスに渡す必要があるのでしょうか? DB 接続の管理は、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();

すべての管理オブジェクトは DB への新しい接続を作成するため、多くの管理オブジェクトを作成すると、いくつかの問題に直面する可能性があることに注意してください。DB をシングルトンとして宣言することで、これを回避できます。

于 2012-07-25T21:05:27.433 に答える
0

ファイル分離で更新

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()
    {
        return $this->connection->prepare('SQL');
    }

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

main.php

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

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