我是stackoverflow的长期粉丝,第一次发布海报。我很想知道是否有人可以帮助我。让我深入研究一些代码,然后我将解释我的问题。我有以下包装类:
class mysqli_wrapper
{
private static $mysqli_obj;
function __construct() // Recycles the mysqli object
{
if (!isset(self::$mysqli_obj))
{
self::$mysqli_obj = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DBNAME);
}
}
function __call($method, $args)
{
return call_user_func_array(array(self::$mysqli_obj, $method), $args);
}
function __get($para)
{
return self::$mysqli_obj->$para;
}
function prepare($query) // Overloaded, returns statement wrapper
{
return new mysqli_stmt_wrapper(self::$mysqli_obj, $query);
}
}
class mysqli_stmt_wrapper
{
private $stmt_obj;
function __construct($link, $query)
{
$this->stmt_obj = mysqli_prepare($link, $query);
}
function __call($method, $args)
{
return call_user_func_array(array($this->stmt_obj, $method), $args);
}
function __get($para)
{
return $this->stmt_obj->$para;
}
// Other methods will be added here
}
我的问题是,当我在bind_result()
类上调用mysqli_stmt_wrapper
时,我的变量似乎没有通过引用传递,也没有返回任何内容。为了说明,如果我运行这部分代码,我只得到NULL:
$mysqli = new mysqli_wrapper;
$stmt = $mysqli->prepare("SELECT cfg_key, cfg_value FROM config");
$stmt->execute();
$stmt->bind_result($cfg_key, $cfg_value);
while ($stmt->fetch())
{
var_dump($cfg_key);
var_dump($cfg_value);
}
$stmt->close();
我也从PHP中得到一个很好的错误,它告诉我:PHP Warning: Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given in test.php on line 48
我试图重载bind_param()
函数,但我无法弄清楚如何通过引用获取可变数量的参数。 func_get_args()
似乎无法提供任何帮助。
如果我按照$stmt->bind_result(&$cfg_key, &$cfg_value)
中的引用传递变量它应该可以工作,但这是不推荐使用的行为并且会引发更多错误。
有没有人对此有一些想法?非常感谢你的时间。
答案 0 :(得分:2)
如果你将从mysqli_stmt类扩展,你将绕过引用问题。 (没有干净的解决方案)
class mysqli_stmt_wrapper extends mysqli_stmt {
public function __construct($link, $query) {
parent::__construct($link, $query);
}
}
class mysqli_wrapper extends mysqli {
public function prepare($query) {
return new mysqli_stmt_wrapper($this, $query);
}
}
答案 1 :(得分:1)
在#php irc频道的帮助下,我提出了以下解决方案:
// We have to explicitly declare all parameters as references, otherwise it does not seem possible to pass them on without
// losing the reference property.
public function bind_result (&$v1 = null, &$v2 = null, &$v3 = null, &$v4 = null, &$v5 = null, &$v6 = null, &$v7 = null, &$v8 = null, &$v9 = null, &$v10 = null, &$v11 = null, &$v12 = null, &$v13 = null, &$v14 = null, &$v15 = null, &$v16 = null, &$v17 = null, &$v18 = null, &$v19 = null, &$v20 = null, &$v21 = null, &$v22 = null, &$v23 = null, &$v24 = null, &$v25 = null, &$v26 = null, &$v27 = null, &$v28 = null, &$v29 = null, &$v30 = null, &$v31 = null, &$v32 = null, &$v33 = null, &$v34 = null, &$v35 = null) {
// debug_backtrace returns arguments by reference, see comments at http://php.net/manual/de/function.func-get-args.php
$trace = debug_backtrace();
$args = &$trace[0]['args'];
return call_user_func_array(array($this->mysqlObj, 'bind_result'), $args);
}
答案 2 :(得分:0)
我猜这是因为原始函数签名指定它需要引用,而你的__call
不能这样做。因此,请尝试不使用__call
,而是明确添加与原始函数签名相同的bind_result
。