【问题标题】:Reference unknown number of variables / func_get_args()引用未知数量的变量 / func_get_args()
【发布时间】:2013-12-31 00:50:13
【问题描述】:

如何引用未知数量的变量?

一个例子:

referenceme($a, $b, $c);
referenceme($a, $b);
referenceme($a, $b, $c, $d);

// What I theoretically want to do:
function referenceme(&func_get_args()){
  ...
}

如果这是不可能的,我想知道准备好的语句的 bind_result() 函数是如何做到这一点的? http://www.php.net/manual/de/mysqli-stmt.bind-result.php

我不想做的事:

function referenceme(&$a = false, &$b = false, &$c = false, &$d = false, &$e = false, ...){
  ...
}

我也不想传递数组。

我实际上想要做的是给自己写一个类来通过准备好的语句来处理我的数据库查询。所以我想模仿一些功能。但是 bind_result() 对我来说完全是个谜。

可能有一些疯狂的解决方案?就像在调用实际函数之前计算变量的数量并将其重定向到调用 eval ,这是“创建”所需的函数?

【问题讨论】:

  • 请查阅圣经 (ro1.php.net/func_get_args)
  • 在 PHP 中没有这样做的好方法。做到这一点的唯一方法是使用 debug_backtrace 但它非常难看。为什么不尝试 OOP 方法?像 $preparedStmt->add($a) 这样的东西?你也可以链接 $preparedStmt->add($a)->add($b)->add($c);
  • 谢谢你,Alex Barroso,我喜欢你的 add() 想法。这不是我最初想要的,但这对我来说似乎是一个很好的解决方法。

标签: php


【解决方案1】:

这是mysqli 工作失败的一个领域。 (PDO 实际上有一个much cleaner implementation 用于绑定参数)。如果您使用mysqlnd(检查phpinfo() 中的mysqlnd 块),我强烈建议您跳过bind_result() 并改用更现代的get_result()。不同的是get_result返回一个mysqli_result对象,这意味着你的结果更加封装和灵活。

现在,关于变量参数的其他问题。你是对的,func_get_args 可以返回传递的参数,但这很快就会成为一个站不住脚的提议,特别是如果你想使用像 bind_param() 这样的东西,它不仅通过引用传递,还需要你指定数据类型也是如此。再加上这是您应用程序的基础设施层,您很可能会得到一个列出数十个字段的函数调用。

如果你正在构建一个类,你应该注入你的 DB 指针(最好在这里使用 OOP 而不是程序),然后让你的类使用 getter 和 setter 函数来解决它,这些函数会设置内部数据,然后将它传递给您的mysqli 班级。这个例子过于简单了(它没有进行严重的错误检查),但它应该可以帮助你做你需要做的事情。

class dbHelper {
    /** @var \mysqli */
    protected $mysqli;
    /** @var array */
    protected $args = array('');

    public function __construct(\mysqli $mysqli) {
        $this->mysqli = $mysqli;
    }

    public function setArgs($data, $type) {
       $this->args[0] .= $type;
       $this->args[] = &$data;
       return $this; // Chain your calls if you want
    }

    public function reset() {
         $this->args = array('');
         return $this;
    }

    public function doQuery($sql) {
         $prep = $this->mysqli->prepare($sql);
         if(count($this->args) > 1) call_user_func_array(array($prep, 'bind_param'), $this->args);
         $prep-execute();
         return $prep->get_result();
    }
}

【讨论】:

  • 谢谢,非常感谢。我会看看 mysqlnd - 它看起来很有希望。您的 dbhelper 类确实是我想要创建的一个很好的例子。
  • 我真的很想为这个答案给你更多的荣誉,因为这是一个模型答案,我可以在此基础上提高我的编程技能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多