如何使用可变数量的参数重载方法?

时间:2011-08-10 11:57:06

标签: php

我有一个包含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
    // ...
}

但是我得到了“注意:尝试在第25行的/home/alessandro/www/admin/index.php中获取非对象的属性”对应于if语句($ unq_vstr-> num_rows)。

我做错了什么? 我很确定它可能依赖于DB类,但我无法弄清楚问题是什么。

你认为我应该用另一种方法来做它(没有在我自己的类中包装mysqli)吗? 任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:3)

您正在寻找

示例:

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

有关可能的回调语法,请参阅Pseudo-types and variables一章

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

另见