2011-08-10 26 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的。

在其他PHP文件,我有:

$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 25“对应于if语句($ unq_vstr-> num_rows)。

我在做什么错? 我很确定它可能取决于数据库类,但我无法弄清楚是什么问题。

你觉得我应该用另一种方式来做到这一点吗(没有在我自己的类中包装mysqli)? 任何建议表示赞赏。

回答

3

您正在寻找

例子:

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

参见Pseudo-types and variables的章节可能回调语法

在一个旁注,包装和mysqli实例int一个Decorator,不装饰任何方法调用是毫无意义的。所以,是的,我认为你不应该把mysqli对象包装到装饰器中。相反,在bootstrap中创建一次mysqli实例,然后将其传递给任何需要它的组件,从里到外堆叠对象。

另见

+0

哇,好一个完整的答案。非常感谢!这真的很有帮助。 –