【问题标题】:How to pass arguments to a function without repeating them so many times?如何在不重复多次的情况下将参数传递给函数?
【发布时间】:2012-01-15 23:23:57
【问题描述】:

我试图避免这种情况:

function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {

   function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) {
      // code    
   }

   do_something_else($arg1, $arg2, $arg3, $arg4, $arg5);

   // do other things with the args

}

也就是说,一遍又一遍地重复 args,尤其是在有很多 args 的情况下。在此示例中,我需要在主 do_something 函数内有一个名为 do_something_else 的嵌套函数。嵌套函数还使用传递给它的父级的所有相同参数。所以我必须将它们传递给它,并在实际执行 do_something 函数时再次重复所有这些参数。

有没有更简洁的方法来处理这个问题?我知道内置的 php 函数 func_get_args() 返回一个函数内所有参数的数组,但是如何将它们传递给子函数以便它们也可以在那里使用,基本上是在寻找一种方法来做到这一点而无需重复 args这么多次?

【问题讨论】:

  • 考虑将所有参数放入一个类/数组中。
  • 据我所知,PHP 不支持嵌套函数。如果您两次调用do_something,它将中断。
  • 我正在取回社区网站的成员列表。用户可以根据各种条件进行搜索,do_something_else 函数实际上是一个 build_query 函数,它根据用户指定的内容构建 select sql 语句。如果用户省略了一些可选字段,我不需要将它们添加到查询的子句中,以便将它们传递到主函数中,然后我检查它们是否为空。如果没有,那么我构建查询以包含它们。无论如何,它在它自己的功能内的原因是因为......
  • 我需要执行两次查询,以获得分页的总记录数。因此,我没有将所有代码重复两次,而是将其放在一个函数中,这样我就可以执行两次。

标签: php


【解决方案1】:

你已经说过了。为简单起见,您可以使用func_get_args()。将它与call_user_func_array() 结合起来就完成了:

call_user_func_array("do_something_else", func_get_args());

实际上有一个小警告。这仅适用于 PHP 5.3 及更高版本。在此之前你需要一个临时变量:

$args = func_get_args();
call_user_func_array("do_something_else", $args);

所以,它实际上并没有更简洁。但它已经展示了另一种选择:只需优化您的函数签名以使用数组中的参数。

【讨论】:

  • 这样做了,我可以使用第一个,因为我在 5.3.6 上。谢谢!
【解决方案2】:

把你的论点放在一个对象中。

【讨论】:

  • 不能保证参数的相关性应该在同一个对象中。事实上,它们也可能已经是对象了......
  • 它们都被传递到一个函数中的事实是一种关系。是什么阻止您将对象放入对象中?
  • 能否举个例子,我是 OOP 新手。
  • @Arjan 即便如此,嵌套函数也有所有迹象表明对象更适合。
  • 对象中的对象没有错。尽管如此,在不知道 do_something() 和 do_something_else() 应该做什么的情况下,很难说将这些参数全部放在同一个对象中是否有意义。
【解决方案3】:
function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {

  function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) {
    echo $arg5;
  }

  call_user_func_array('do_something_else', func_get_args());
}

这只会为您节省一次重复,即调用do_something_else 函数。

【讨论】:

    【解决方案4】:

    您可以使用数据传输对象 ( DTO )。 DTO 是一种数据结构(结构或类),用于在层或函数之间传输数据。

    【讨论】:

      【解决方案5】:

      对于嵌套函数,您还可以使用“use”关键字让闭包使用周围上下文中的变量。我经常这样做:

      $function = function($var) use ($context1, $context2) {
          // code
      }
      $function($input1);
      $function($input2);
      

      它确实需要 PHP 5.3 或更高版本。

      【讨论】:

        【解决方案6】:

        你总是可以只传递一个关联的数组。允许灵活性。

        function sample($data = array()) {
           print_r($data);
        }
        
        sample(array('id'=>123.'category'=>'tv'));
        

        【讨论】:

          【解决方案7】:

          你基本上通过提及func_get_args()来给出答案。

          function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {
          
             function do_something_else($args) {
                // code    
             }
          
             do_something_else(func_get_args());
          
             // do other things with the args
          
          }
          

          【讨论】:

            猜你喜欢
            • 2020-09-10
            • 1970-01-01
            • 1970-01-01
            • 2021-09-14
            • 1970-01-01
            • 1970-01-01
            • 2019-07-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多