我有一个包含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)吗? 任何建议都表示赞赏。
答案 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实例,然后将其从那里传递给任何需要它的组件,从内到外堆叠对象。
另见