【问题标题】:php function argumentsphp函数参数
【发布时间】:2012-04-28 04:36:28
【问题描述】:

我不知道我是如何或从哪里得到这个想法的,但出于某种原因,我认为这是可能的。显然经过测试它不起作用,但是有没有办法让它起作用?我想设置 $value2 而无需为 $value1 输入任何内容。

function test($value1 = 1, $value2 = 2) {

echo 'Value 1: '.$value1.'<br />';
echo 'Value 2: '.$value2.'<br />';

}

test($value2 = 3);

// output
Value 1: 3
Value 2: 2

【问题讨论】:

  • 不可能。您真的想要这种行为,请在签名中切换 args 1 和 2。
  • 是的,您正在寻找 PHP 中不可用的关键字参数,但例如在 Python 中。
  • 感谢您迄今为止的所有回答。是的,主要的一点是希望我不必做任何工作,但显然这是不可能的。我想知道为什么这在 php 中无法实现?

标签: php function arguments optional-arguments


【解决方案1】:

不可能完全按照你想要的方式。

简单地说,

function test($value1 = null, $value2 = 2) {

echo 'Value 1: '.$value1.'<br />';
echo 'Value 2: '.$value2.'<br />';

}

test(NULL, $value2 = 3);

或者,使用数组作为参数

function test($array) {

if(isset($array['value1'])) echo 'Value 1: '.$array['value1'].'<br />';
if(isset($array['value2'])) echo 'Value 2: '.$array['value2'].'<br />';

}

test(array('value2' => 3));

更新:

我的另一个尝试

function test() {
  $args = func_get_args();
  $count = count($args);
  if($count==1) { test1Arg($args[0]); }
  elseif($count == 2) { test2Arg($args[0],$args[1]); }
  else { //void; }
}

function test1Arg($arg1) {
   //Do something for only one argument
}
function test2Arg($arg1,$arg2) {
   //Do something for two args
}

【讨论】:

  • OP 知道这个解决方案:“我想设置 $value2 而无需为 $value1 输入任何内容”。
  • 努力+1,但在我看来,作为参数解决方案的数组正在远离问题的本质
  • test(NULL, $value2 = 3); 会导致不良行为,因为 $value2 = 所做的事情与 OP 想要做的事情完全不同,并且在阅读时会产生误导。
  • 您在此答案中编辑的数组的想法很好,遗憾的是我无法改变我的投票。
  • @rami,我编辑了,所以你可以改变你的投票,我也用另一种方式更新了。
【解决方案2】:

您尝试执行的操作称为“关键字参数”或“命名参数”,与 Python 等其他脚本语言相比,PHP 中不可用。

如果您有具有数百个参数的函数,并且确实希望获得比 PHP 附带的更灵活的解决方案,您可以使用数组或对象构建自己的解决方法,也许与 func_get_args() 结合使用。但这显然不如真正的关键字参数漂亮。

【讨论】:

    【解决方案3】:

    对于一个简单的函数,跳入 OOP 可能是不切实际的;但是,为了给这种变化火上浇油,在这种情况下,您可能会使用 OOP,无论好坏。

    为了您的方便,默认函数参数很难交换,但是,扩展类并非如此。这些意味着随着需要的变化而变化和变异。

    class test {
        var $value1 = 1;
        var $value2 = 2;
    
        function __construct() {
            printf( "Value 1 = %s, value 2 = %s\n", $this->value1, $this->value2 );
        }
    }
    
    class test2 extends test {
        var $value2 = 42;
    }
    
    $me = new test();   // outputs Value 1 = 1, value 2 = 2
    $me2 = new test2(); // outputs Value 1 = 1, value 2 = 42
    

    再次强调,这不是最简单任务的实用解决方案,但是,它可以让您随意更改代码片段。重新考虑是否可以重写代码以利用这种风格。

    【讨论】:

      【解决方案4】:
      function test($value1 = null, $value2 = null) {
        $value1 = $value1 ?: 1;
        $value2 = $value2 ?: 2;
        echo 'Value 1: '.$value1.'<br />';
        echo 'Value 2: '.$value2.'<br />';
      }
      
      test(null, 3);
      

      【讨论】:

      • 据我所知,OP 知道这个解决方案,所以我认为这不是他想要的。
      • 感谢您的提示,但这就是它的工作方式,即使 OP 不喜欢它。
      • 但如果你有一个有 15 个参数的函数,这不是你想要的。请参阅我的 Starx 或 TRiG 的答案——我想在这种情况下,数组是最好的解决方案
      • 你真的有带有十五个参数的函数/方法?!? Oo 听起来像一个设计缺陷:X
      • 我没有。但有时它确实有意义。
      【解决方案5】:

      AFAIK,你不能按照你想要的方式修改参数的值。手册甚至说这是无效的(http://php.net/manual/en/functions.arguments.php#example-153)。

      您对test($value2 = 3); 所做的首先是为新变量$value2 赋值3,然后将其作为testfirst 参数发送。

      但是,您可以创建一个函数,当您发送一个空参数时,它会获得一个赋值:

      function test($value1 = NULL, $value2 = 2) {
      
          if ($value1 === NULL)
              $value1 = 1 // $value1 default value
      
          echo 'Value 1: '.$value1.'<br />';
          echo 'Value 2: '.$value2.'<br />';
      
      }
      
      test(NULL, 3);
      
      // output
      Value 1: 1
      Value 2: 3
      

      或者,改变变量的默认值:

      function test($value2 = 2, $value1 = 1) {
      
          echo 'Value 1: '.$value1.'<br />';
          echo 'Value 2: '.$value2.'<br />';
      
      }
      
      test(3);
      
      // output
      Value 1: 1
      Value 2: 3
      

      【讨论】:

        【解决方案6】:

        这在 PHP 中是不可能的,虽然它很方便,但是有几种方法可以解决它。

        function func($val1=null, $val2=null) {
            // Set default values.
            if (!$val1) $val1 = 1;
            if (!$val2) $val2 = 2;
            // Your code here.
        }
        
        func(null, 74); // Uses the default value of 1 for $val1.
        

        或者使用数组(如果参数列表很长,会更方便):

        function func($arr) {
            // Set default values.
            $val1 = isset($arr[1]) ? $arr[1] : 1;
            $val2 = isset($arr[2]) ? $arr[2] : 2;
            // Your code here.
        }
        
        func(array(2 => 74)); // Uses the default value of 1 for $val1.
        

        实际上,我有一个函数,它接受数组、键和默认值,并返回一个值,所以我可以将这些行写成

        $val1 = Core::val($arr, 1, 1); // array, key, default
        $val2 = Core::val($arr, 2, 2);
        

        【讨论】:

          【解决方案7】:

          将具有默认值的参数放在不带默认值的参数之后被认为是不好的做法。原因是它不允许简单地编写一个带有一堆逗号的函数。

          在您的情况下,您应该将值传递给两个参数。即使值为空。

          【讨论】:

            【解决方案8】:

            也许这就是你要找的东西:

                function test($value1, $value2) 
                {
            
                  if ($value1!="") 
                  {
                     echo 'Value 1: '.$value1.'<br />'; 
                  }
                  else
                  {
                     echo 'Value 1: 3'<br />'; 
                  }
                  echo 'Value 2: '.$value2.'<br />';
            
                }
            
                test("", $value2 = 3);
            
                // output
                Value 1: 3
                Value 2: 2
            

            【讨论】:

            • 据我所知,OP 知道这个解决方案,所以我认为这不是他想要的(他根本不想传递任何值 vor $value1,如果你有一堆论据。)
            • Rami,感谢您的评论,但没有更简单的方法。不幸的是,必须给出 value1 的参数。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 2010-12-09
            • 2013-05-09
            相关资源
            最近更新 更多