2013-02-11 70 views
-2

我在PHP中有一個函數,它有一些參數默認爲null,這樣我就可以用少於整數個參數的方式輕鬆調用它。 問題是,當我直接使用null-defaulted參數時,我得到給定的參數,但是當我嘗試將該值複製到另一個變量時,變量僅獲取默認值null。 它看起來像這樣:默認參數值是否覆蓋提供的參數?

// inside my MySQLI wrapper class... 
public function bind(&$stmt, $types = "", &$arg1, &$arg2 = null, &$arg3 = null /* this goes up to 20; it's auto-generated by another script */) 
{ 
    echo "dumping..."; 
    var_dump($arg1); // var_dump shows value from function call (string(0)) 
    var_dump($arg2); // ditto 
    echo "...dumped"; 
    if ($arg2 != null) $foo = $arg2; var_dump($foo); echo "foo"; // var_dump shows that $foo is NULL 
    /* ... */ 
} 

我把這樣的功能,從另一個腳本:(這是處理卡車和轎車的虛擬腳本)

$make = ""; 
$model = ""; 
$year = 0; 
$license = ""; 
list($error, $message) = $mysql->bind($stmt, "", $make, $model, $year, $license); 

bind()功能是包裝到MySQLI的bind_param()bind_result()函數。 我只包括頂級的幾行,因爲它已經失敗了,甚至還沒有達到實際的邏輯。

現在,它看起來像是PHP中的一個錯誤,因爲這不符合我所知道的變量,參數,默認參數和引用的工作方式。 此外,這個問題只出現在我的真實代碼中,並沒有出現在我編寫的測試這個簡單的php文件中。

進一步信息:

$foo被分配NULL,當$arg2是一個空字符串,"",並正確時,它是一個非空字符串被分配。空字符串仍然是有效的字符串,那麼爲什麼PHP這樣做呢?

+2

我試了一下,我沒有問題:http://codepad.org/9cioWS04 – 2013-02-11 19:45:55

+1

你也可以說這實際上產生問題的代碼?如果您發佈的代碼沒有生成該代碼,那麼即使您認爲它們在功能上相同,也必須在兩者(或其上下文)之間有所區別。這也可能有助於瞭解您如何調用該函數。 – octern 2013-02-11 19:46:13

+0

哦,另外:'null'可能是一個不好的測試默認值,因爲很多東西都會導致變量被設置爲null。我建議將代碼中的默認值更改爲其他值。如果變量仍然以null結尾,那麼你的問題與默認值無關。 – octern 2013-02-11 19:47:42

回答

1

問題是!=比較。發生什麼事是PHP type-juggles至少有一個變量,因此,"" != null評估爲false。該表部分向下this page顯示了不同類型之間的比較會發生什麼。需要一個類型嚴格的形式!==

if ($arg2 !== null) 
    $foo = $arg2;