代码之家  ›  专栏  ›  技术社区  ›  Agnius Vasiliauskas

PHP中TRUE和FALSE常量定义之间的不一致性

  •  2
  • Agnius Vasiliauskas  · 技术社区  · 5 年前

    有时我会因为这个把头撞到墙上。

    var_dump(ord(true), ord(false));
    

    给予:


    整数(0)

    所以TRUE被转换成ASCII码49-数字1,FALSE被转换成ASCII码0(零字节)。 为什么真/假转换成字符串时会出现这种不一致?

    此类定义的最大问题是,如果将布尔值存储在某些变量中(稍后保存在数据库中),则TRUE存储为“1”,FALSE存储为“”—空字符串。所以在存储到数据库之前,您需要转换成整数 (int)($bool_variable) . 鉴于PHP支持全自动类型转换,需要执行 手册

    有什么想法吗?

    1 回复  |  直到 5 年前
        1
  •  5
  •   deceze    5 年前

    要求 ord 一个 bool . 作战需求文件 需要字符串,因此将任何输入强制转换为字符串。 true 强制转换为 '1' ,和 false '' . 这个 作战需求文件 属于 '1' 49 ,以及 作战需求文件 空字符串的 0

    那并不意味着 真的 定义 像这样的。 定义为 真的

    至于 为什么? 这些铸造规则存在:

    布尔值 TRUE "1" . 布尔型 FALSE 转换为 "" (空字符串)。这允许在布尔值和字符串值之间来回转换。

    https://www.php.net/manual/en/language.types.string.php#language.types.string.casting

    不,没有比这更合理的了。

        2
  •  4
  •   IMSoP    5 年前

    你的困惑之一是 ord

    注意PHP 没有 转换 false ord() 超出了它的用途:您传递了一个空字符串,并询问“这个字符串的第一个字节是什么?”可以说,它应该给你一个错误,但在这种情况下,它决定给你 0 .

    更好的测试是 var_dump ,用于检查PHP值:

    var_dump(true); // bool(true)
    var_dump(false); // bool(false)
    var_dump((string)true); // string(1) "1"
    var_dump((string)false); // string(0) ""
    

    如果要将布尔值转换为选定的表示形式,最好的方法是使用三元运算符:

    $bitAsInt = $booleanValue ? 1 : 0;
    $bitAsString = $booleanValue ? '1' : '0';
    $booleanKeyword = $booleanValue ? 'true' : 'false';
    $boolString = $booleanValue ? "'t'" : "'f'";
    

    以上所有这些都适用于某些情况下的某些数据库系统,并且可以很好地解释为什么 (string)$booleanValue 不能每次都给你正确的东西。

    还有其他一些场景 (string)false 给出一个空字符串是最有用的,这是PHP决定的。即:

    (string)$booleanValue === ($booleanValue ? '1' : '')
    

    “为什么”总是有很多答案的。对于历史上下文,这可能是受到Perl(在创建PHP时,Perl在web编程中很流行)的启发——尽管它没有布尔类型,但它确实表现出类似的转换行为:

    print ( 1==1 ); # true as string, gives '1'
    print ( 1==2 ); # false as string, gives ''
    print 0 + ( 1==1 ); # true as int, gives 1
    print 0 + ( 1==2 ); # false as int, gives 0
    
        3
  •  -1
  •   psykx    5 年前

    php认为空字符串为false。不管它是否从数据库中读取。