2012-04-16 71 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 

再次,不是最簡單的任務的實際解決方案,但它,它可以讓你隨意突變代碼片段。重新考慮你是否可以重寫你的代碼來利用這種風格。