-1

重複の可能性:
リファレンス - PHP でこのエラーはどういう意味ですか?

私は2つのクラスを持っています:

  1. データベース クラス
  2. libtables クラス

データベース クラスでは、スクリプト全体で mysqli と連携するオブジェクトを作成しました。.php ファイルのデータベース クラスから関数を呼び出そうとすると機能します。

簡略化されたデータベース クラス:

class Database {

protected static $_instance;
protected $_mysqli;
protected $_query;


public function __construct($host, $username, $password, $db) {
    $this->_mysqli = new mysqli($host, $username, $password, $db)
        or die("There was a problem connecting to the database");
}

public function close() {

    $this->_mysqli->close();

}

public function query($q) {
    return $this->_mysqli->query($q);
}

}

しかし、Libtables クラスのデータベース クラスから関数を呼び出そうとすると失敗し、「オブジェクト以外のメンバー関数 query() を呼び出します」というエラーが表示されます。

単純化された Libtables クラス:

class Libtables {

    function getCol($table) {
    $q = "SELECT * from " . $table . ";";
    $res = $db->query($q);
    return $res;
    }

}

この方法でデータベース クラス オブジェクトを作成しました。

$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
global $db;
4

3 に答える 3

3

global $db;getCol 関数で必要です。

function getCol($table) {
    global $db;
    $q = "SELECT * from " . $table . ";";
    $res = $db->query($q);
    return $res;
}

以下のコメントに基づいて編集します。

もう 1 つのオプションは、DB をクラスのプロパティとして格納することです。以下は単純化された応答です。(var $dbプライベートを作成し、コンストラクターを介して渡すことを検討する必要があります。詳細については、変数のスコープとオブジェクトのコンストラクターに関するドキュメントを参照してください。)

class Libtables {

    var $db;

    function getCol($table) {
        $q = "SELECT * from " . $table . ";";
        $res = $this->db->query($q);
        return $res;
    }

}

$oLibtables = new libtables();
$oLibtables->db = $db;
于 2012-10-21T13:26:37.137 に答える
1

発生している問題はスコープに関係しています。$db変数はクラス内で初期化されませんLibtables

$dbこれについては、使用する必要がある関数で変数 global を定義することで実行できます。

class Libtables 
{
    public function getCol($table) 
    {
        global $db;

        $q = "SELECT * from " . $table . ";";
        $res = $db->query($q);

        return $res;
    }
}

または、クラス コンストラクターを介して変数を挿入して、どこでも使用できるようにすることもできます (グローバルを使用するよりも少しクリーンなコード)。

class Libtables 
{
    private $_db;

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

    public function getCol($table) 
    {
        $q = "SELECT * from " . $table . ";";
        $res = $this->_db->query($q);

        return $res;
    }
}

作成Libtables

$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.....
$lib = new Libtables($db);

HTH

于 2012-10-21T13:32:59.100 に答える
0

みんなありがとう。データベース オブジェクトを libtables クラスに渡すことで機能するようになりました。

于 2012-10-21T13:47:35.670 に答える