2012-08-24 23 views
2

我有以下功能安全地得到一個cookie:如何類型傳遞到一個函數在PHP

public static function get_cookie($parameter, $default) 
{ 
    return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default; 
} 

當我嘗試讀取false然後在三元運營商使用它,我看到的值被視爲字符串(它被鑄造成true)。

我想將一個類型傳遞給這個函數並且投射這個值,但是沒有想法如何。

UPDATE

正如尼科指出,鑄造「假」布爾不起作用:http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

我想,我一定要在cookie中存儲的字符串始終。 (例如,對於我的情況,「是」和「否」,而不是「假」和「真」)。

+2

你確定你沒有把它作爲一個字符串開始嗎? –

+0

用'gettype'首先測試參數的類型http://php.net/manual/en/function.gettype.php – peacemaker

+0

@John Conde Eh ...傳遞什麼?對不起,我很愚蠢。 – noober

回答

1

絕對沒有任何需要做的功能(尤其是因爲PHP是弱類型)內的鑄造。

考慮以下用例:

$booleanValue = ClassName::get_cookie('foo', true, 'bool'); 

你結束了相同數量的代碼(但更具可讀性!)當你這樣做的get_cookie()外鑄造:

$booleanValue = (bool) ClassName::get_cookie('foo', true); 

但是,您仍然可以分別實現「錯誤」和「真正」字符串的簡單切換:

public static function get_cookie($parameter, $default, $isPseudoBool = false) { 
    $value = isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default; 

    if ($isPseudoBool) { 
     $value = ($value === true || strcasecmp($value, 'true') === 0); 
    } 

    return $value; 
} 

如果你還是喜歡的類型轉換進入的功能,settype()就是你需要爲這個:

public static function get_cookie($parameter, $default, $type) { 
    $value = isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default; 
    settype($value, $type); 
    return $value; 
} 

但請注意,這不會將字符串轉換爲「假」來如果指定$type = 'bool',布爾值false - 轉換規則與解釋器完成隱式轉換時的轉換規則相同。

+0

好點。你是的,我的意思是在函數之外進行拋出,hardcoding isType1,isType2 ...似乎並不是個好主意 – noober

+0

坦率地說,我仍然更喜歡將類型傳遞爲不是可選參數來消除這類錯誤。 – noober

+0

@noober我已經添加了一個版本來接受所需類型的返回值的參數,但是我仍然不會推薦這個 – Niko

0

試試這個

public static function get_cookie($parameter, $default) 
{ 

    if(empty($parameter)) return $default;  

    return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default; 
} 
相關問題