【问题标题】:PHP: Define function with variable parameter count? [duplicate]PHP:定义具有可变参数计数的函数? [复制]
【发布时间】:2011-01-08 05:51:57
【问题描述】:

有没有办法在 PHP 中定义一个函数,让您定义可变数量的参数?

用我比较熟悉的语言是这样的:

function myFunction(...rest){ /* rest == array of params */ return rest.length; }

myFunction("foo","bar"); // returns 2;

谢谢!

【问题讨论】:

    标签: php function parameters php4


    【解决方案1】:

    虽然这个问题很老了:实际上在 PHP 5.6+ 中你可以准确地写出你写的内容:D

    【讨论】:

      【解决方案2】:

      或者只是

      function printArgs() {
      
       foreach (func_get_args () as $arg){
        echo $arg;
       }
      }
      
      printArgs("1 ", "2 ", "three ");
      

      输出1 2 three

      【讨论】:

        【解决方案3】:

        是的。使用func_num_args()func_get_arg() 获取参数:

        <?php
          function dynamic_args() {
              echo "Number of arguments: " . func_num_args() . "<br />";
              for($i = 0 ; $i < func_num_args(); $i++) {
                  echo "Argument $i = " . func_get_arg($i) . "<br />";
              }
          }
        
          dynamic_args("a", "b", "c", "d", "e");
        ?>
        

        在 PHP 5.6+ 中,您现在可以使用 variadic functions:

        <?php
          function dynamic_args(...$args) {
              echo "Number of arguments: " . count($args) . "<br />";
              foreach ($args as $arg) {
                  echo $arg . "<br />";
              }
          }
        
          dynamic_args("a", "b", "c", "d", "e");
        ?>
        

        【讨论】:

        • 很确定 func_get_args () 是您真正想要使用的,而不是这个冗长的第一个解决方案。
        【解决方案4】:

        您可以为任何函数接受可变数量的参数,只要有足够的参数来填充所有声明的参数。

        <?php
        
        function test ($a, $b) { }
        
        test(3); // error
        test(4, 5); // ok
        test(6,7,8,9) // ok
        
        ?>
        

        要访问传递给test() 的额外未命名参数,请使用函数func_get_args()func_num_args()func_get_arg($i)

        <?php
        
        // Requires at least one param, $arg1
        function test($arg1) {
        
          // func_get_args() returns all arguments passed, in order.
          $args = func_get_args();
        
          // func_num_args() returns the number of arguments
          assert(count($args) == func_num_args());
        
          // func_get_arg($n) returns the n'th argument, and the arguments returned by
          // these functions always include those named explicitly, $arg1 in this case
          assert(func_get_arg(0) == $arg1);
        
          echo func_num_args(), "\n";
          echo implode(" & ", $args), "\n";
        
        }
        
        test(1,2,3); // echo "1 & 2 & 3"
        
        ?>
        

        【讨论】:

          【解决方案5】:

          我喜欢对我的 PHP 参数采用 Javascript 风格的方法。这允许更好地设置“选项”及其默认值(我将立即查看)。例如,假设您有一个函数返回数组中的时间范围。参数 1 是开始时间,参数 2 是结束时间,参数 3 是时间间隔,之后的任何选项都是可选的(如“格式”=>“24 小时”,“include_seconds”=> TRUE 等。 )。

          我会这样定义函数:

          function returnTimeInterval($startTime, $endTime, $interval, $options = array())
          {
              // the first thing to do is merge options in with our defaults
              $options = array_merge(array(
                  "format" => "24-hour",
                  "include_seconds => TRUE
                  // etc.
              ), $options);
          

          这允许在函数中设置默认值,然后可以覆盖,这非常酷。当然,你需要注意不要传入奇怪的、未使用的选项,但我会把它留给你。 :)

          【讨论】:

          • array_intersect_key() 将有助于避免未知选项。
          【解决方案6】:

          我鼓励您将一个数组传递给您的函数,这样您就可以在该数组中存储尽可能多的不同参数。一旦数组在函数中,您可以对它进行许多操作以获得所需的正确信息。

          $array = array();
          $array[0] = "a";
          $array[1] = 1;
          
          myFunction($array);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            • 2011-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多