代码之家  ›  专栏  ›  技术社区  ›  anomareh

PHP调用参数量可变的函数

  •  1
  • anomareh  · 技术社区  · 14 年前

    所以我遇到了一些问题。我知道一个解决方案,但它看起来不太干净,我想知道是否有更好的解决方案。

    我正在编写一个mysqli包装器,用于运行准备好的语句。因为它是一个包装器,可以重用 (动态) 返回的列数取决于查询,并且不是静态的。

    我已经找到了一个解决这个问题的方法,似乎每个人都在使用 call_user_func_array .

    它是有效的,但我的问题是它让我创建了一个额外的引用数组,在一开始我不应该真正需要它。

    例如:

    <?php
    
    // Connect, prepare statement, etc.
    
    $stmt->execute();
    
    $fields = $stmt->result_metadata();
    $fields = $fields->fetch_fields();
    
    foreach ($fields as $field) {
        // Unnecessary creation of an array.
        $params[] = &$row[$field->name];
    }
    
    call_user_func_array(array($stmt, 'bind_result'), $params);
    
    ?>
    

    现在我正在创建另一个数组 调用用户函数数组 通过引用传递参数,因为它不符合方法定义。

    有办法吗 调用用户函数数组 是否遵守方法/功能定义?是否有更清晰的方法来调用参数数目可变的方法/函数?或者,是否只有一个整体上更清洁和更好的解决方案来解决这个问题?

    我打电话时也遇到类似的问题 bind_param 同时尝试保持能够更改绑定参数和重新运行语句的功能不变。

    在某些方面,下面的代码究竟在做什么。

    $row[$field->name] = &$row[$field->name];
    

    它奇怪地工作,不会产生任何错误,尽管我不知道变量如何引用自己。除了我没有创建另一个数组这一事实之外,它和前者有什么区别吗?这样比较好吗?

    谢谢。

    编辑:

    这就是我如何使用反射API而不是 call_user_fun_array . 关于我使用它的任何输入,性能与 调用用户函数数组 非常感谢您的实施。我以前没把它搞得一团糟,而且几乎所有的方法都是没有文件证明的,所以我不确定使用它们的正确方法。

    <?php
    
    foreach ($fields as $field) {
        $row[$field->name] = NULL;
    }
    
    $refMethod = new ReflectionMethod($stmt, 'bind_result');
    $refMethod->invokeArgs($stmt, $row);
    
    ?>
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Sarfraz    14 年前

    我知道的一种方法是你可以使用 Reflection 班的 isPassedByReference 方法。

    Here is a solution i came up with after facing that issue for a framework i have had been developing.