2012-04-16 104 views
3

我不知道如何或在哪里我有这个想法在我的脑海,但由于某种原因,我认为这是可能的。显然在测试后它不起作用,但有没有办法让它工作?我想设置$ value2,而不必为$ value1输入任何内容。PHP函数参数

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 
+0

不可能。您确实需要这种行为,请在签名中切换参数1和2。 – 2012-04-16 20:20:05

+0

是的,你正在寻找PHP中没有的关键字参数,例如在Python中。 – 2012-04-16 20:23:17

+0

[PHP中使用函数中的默认参数]的可能的重复(http://stackoverflow.com/questions/9166914/php-using-default-arguments-in-a-function) – 2012-04-16 20:23:54

回答

4

你试图做的是被称为“关键字参数”或“命名参数”,与其他脚本语言比如Python相比,它在PHP中不可用。

如果您的函数有数百个参数,并且确实希望获得比PHP自带的更灵活的解决方案,那么可以使用数组或对象(可能与func_get_args()一起)构建您自己的解决方法。但是,这显然不像真正的关键字参数那样美丽。

7

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

简单,

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 
} 
+1

OP知道这个解决方案:“我想设置$ value2而不必为$ value1输入任何内容”。 – 2012-04-16 20:20:42

+0

+1,但作为param解决方案的数组越来越远离问题的本质,在我看来 – Kristian 2012-04-16 20:22:15

+2

'test(NULL,$ value2 = 3);'导致不想要的行为,如$ value2 ='做了与OP想要做的完全不同的事情,并且在被阅读时会产生误导。 – 2012-04-16 20:22:32

0

它被认为是不好的做法,有来不ARGS后默认值的参数。原因是它不允许简单地写一个函数和一串逗号。

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

-1

也许这是什么ü[R寻找:

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 
+0

据我所知,OP知道这个解决方案,所以我不认为这是他想要的(他想要通过任何价值vor $ value1 AT ALL,这是绝对有道理的,如果你有一堆参数。 ) – 2012-04-16 20:24:22

+0

拉米,感谢评论,但没有简单的方法。不幸的是,必须给出value1的论点。 – dimmat 2012-04-16 20:34:27

+0

是的,但我很确定OP已经知道 – 2012-04-16 20:35:11

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); 
+1

据我所知,OP知道这个解决方案,所以我不认为这是他想要的。 – 2012-04-16 20:23:55

+0

感谢您的提示,但多数民众赞成它的工作方式,即使OP不喜欢它。 – KingCrunch 2012-04-16 20:27:57

+0

但是,如果你有一个具有15个参数的函数,它不是你想要的。看到我的,Starx或TRiG的答案 - 我猜在这种情况下,一个数组是最好的解决方案 – 2012-04-16 20:30:13

0

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

什么你与test($value2 = 3);首先分配给新的变量$value2值为3,然后将其发送作为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 
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); 
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 

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