【问题标题】:How to pass type into a function in PHP如何将类型传递给 PHP 中的函数
【发布时间】:2012-08-24 21:37:15
【问题描述】:

我有以下功能可以安全地获取 cookie:

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

当我尝试读取 false 然后在三元运算符中使用它时,我看到该值被视为字符串(转换为 true)。

我想将一个类型传递给这个函数并转换值,但不知道如何。

更新

正如 Niko 指出的,将 'false' 转换为布尔值不起作用:http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

我想,我必须始终将字符串存储在 cookie 中。 (例如,对于我来说,“是”和“否”而不是“假”和“真”)。

【问题讨论】:

  • 你确定你没有将它作为字符串传递吗?
  • 先用gettypephp.net/manual/en/function.gettype.php测试参数的类型
  • @John Conde Eh...通过什么?对不起,我很笨。
  • 你能告诉我们你是如何调用函数和传递参数的吗?它应该类似于 get_cookie(false, ....
  • @peacemaker 我已经用 gettype 测试了结果,它是字符串 'false' 和 $cookie 吗? 'a' : 'b' 返回 a。

标签: php casting type-conversion


【解决方案1】:

绝对不需要在函数内部进行强制转换(特别是因为 PHP 是松散类型的)。​​

考虑以下用例:

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

当您在 get_cookie() 之外进行强制转换时,您最终会得到相同数量的代码(但可读性更高!):

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

但是,您仍然可以分别为“false”和“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”转换为布尔值false - 转换规则与解释器进行隐式转换时的规则相同。

【讨论】:

  • 好点。谢谢你。我的意思是在函数之外进行投射。硬编码 isType1, isType2... 似乎不是个好主意。
  • 坦率地说,我仍然更喜欢传递类型作为非可选参数来摆脱这种错误。如果我忘记投射怎么办。
  • @noober 我添加了一个版本,该版本接受所需类型的返回值的参数。但是,我仍然不推荐这个。
  • 哦,settype。我必须自己找到它。再次感谢你。我认为,显式类型传递更安全。特别是对我来说,因为我根本不喜欢 PHP 变体类型的输入(只是在今天之前从未遇到过问题)。
  • "这不会将字符串 "false" 转换为布尔值 false" 该死!你说的对! php.net/manual/en/…
【解决方案2】:

试试这个

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

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

    return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多