2012-08-24 21 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; 
} 
相关问题