2011-08-10 8 views
1

私はmysqliインスタンスを保持するクラスを持っています(これはソースコード全体にデータベース設定を広げることを避けるためです)。 DBがどのように見える可変数の引数でメソッドをオーバーロードする方法は?

クラス:あなたは私がやろうとしているものを見るかもしれませんが

class DB { 
    private $mysqli; 

    public function connect() { 
     $this->mysqli = new mysqli("localhost", "user", "pwd", "db-name"); 
    } 

    public function __call($method, $args) { 
     return $this->mysqli->$method(extract($args)); 
    } 
} 

はmysqliのものを実行するすべてのメソッド呼び出しをオーバーロードすることです。

$unq_vstr = $this->db->query("SELECT * FROM user_log WHERE user_ip='$ip' AND user_last_visit='$now';"); 
if ($unq_vstr->num_rows > 0) { // ERROR 
    // ... 
} 

しかし、私は「お知らせを取得しています:行に/home/alessandro/www/admin/index.phpで非オブジェクトのプロパティを取得しようとすると、私が持っている他のPHPファイルで

if文($ unq_vstr-> num_rows)に対応する "25"を返します。

私は間違っていますか? 私はそれがDBクラスに依存する可能性はかなり確信していますが、私は問題が何であるか把握できません。

あなたは私のクラスの中でラップmysqliなしでそれを行う別の方法を使うべきだと思いますか? 何か提案がありがとうございます。

あなたが例

を探している

答えて

3

public function __call($method, $args) { 
    return call_user_func_array(
     array($this->mysqli, $method), 
     $args 
    ); 
} 

mysqliのを包む、追記上で可能なコールバック構文

ためPseudo-types and variablesの章を参照してください。インスタンスint o Decoratorは、メソッド呼び出しのいずれかを装飾しないので、無意味です。だから、はい、私はあなたがデコレータにmysqliオブジェクトをラップするべきではないと思います。その代わりに、ブートストラップで一度mysqliインスタンスを作成し、そこから必要なコンポーネントに渡して、内側からオブジェクトを積み重ねてください。

はまた

+0

うわー、どのような完全な答えを参照してください。どうもありがとうございます!本当に役に立ちます。 –

関連する問題