引用未知数量的变量/ func_get_args()

时间:2013-12-31 00:50:14

标签: php

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

一个例子:

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,这是“创建”所需的函数?

1 个答案:

答案 0 :(得分:1)

这是一个mysqli区域落在工作上。 (PDO实际上对绑定参数有much cleaner implementation。如果您正在使用mysqlnd(检查mysqlnd中的phpinfo()阻止),我强烈建议您跳过bind_result()并使用更现代的get_result()代替。不同的是get_result返回mysqli_result个对象,这意味着您的结果更具封装性和灵活性。

现在,关于变量参数的另一个问题。你是对的func_get_args可以返回传递的参数,但这很快就会变成一个站不住脚的命题,特别是如果你想使用像bind_param()这样的东西,它不仅通过引用而且还通过引用要求您也指定数据类型。再补充一点,这是您的应用程序的基础结构层,您最终可以使用列出许多字段的函数调用。

如果你正在构建一个类,你应该注入你的数据库指针(最好在这里使用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();
    }
}