4

我不知道我是如何或从哪里得到这个想法的,但出于某种原因,我认为这是可能的。显然经过测试它不起作用,但是有没有办法让它起作用?我想设置 $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
4

8 回答 8

8

它并不完全可能按照您想要的方式。

简单地,

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
}
于 2012-04-16T20:19:52.280 回答
4

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

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

于 2012-04-16T20:27:23.180 回答
1

对于一个简单的函数,跳入 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

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

于 2012-04-16T20:31:49.717 回答
0
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);
于 2012-04-16T20:22:50.043 回答
0

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

您正在做的test($value2 = 3);是首先为一个新变量分配一个$value23,然后将其作为.test

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

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
于 2012-04-16T20:24:23.607 回答
0

这在 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);
于 2012-04-16T20:28:46.300 回答
-1

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

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

于 2012-04-16T20:20:02.703 回答
-1

也许这就是你要找的:

    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
于 2012-04-16T20:22:10.740 回答