【问题标题】:Why do false statements print nothing rather than 0 in PHP?为什么错误语句在 PHP 中只打印 0 而不是打印?
【发布时间】:2018-05-16 19:45:59
【问题描述】:

这是一个简单的例子:

echo 3==3; // echoes 1

echo 3==2; // should echo 0, yet echoes nothing

我在设计一个需要复选框的表单时注意到了这一点。当勾选时,复选框传递一个值 1,当取消勾选时,而不是像人们期望的那样传递一个值 0,它什么也不传递;可以说是一个未定义的布尔值。

我尝试使用以下代码解决此问题:

$myBool = isset($_POST['myCheckbox']);

但是,这似乎也不起作用。

将复选框值传递给$myBool 的一种解决方案是进行一些 if-else 调节,但我想要一个更简洁的解决方案。这可能吗?

【问题讨论】:

标签: php


【解决方案1】:

在 PHP 中,每个决策都返回一个布尔值,真或假。所以,echo 3==3; 是一个真实的陈述,这就是它返回 1 的原因,而echo 3==2; 是一个错误的陈述,这就是它什么都不返回的原因。

但是如果你想回显相关的 false 整数(即 0),那么你可以使用类型转换。喜欢:

echo (int)(3 == 2);

它会打印出 0。

【讨论】:

    【解决方案2】:

    测试代码

    // http://php.net/manual/en/language.operators.comparison.php
    
    echo 3==3;
    
    echo "<br>---------------<br>";
    
    echo 3==2;
    
    echo "<br>---------------<br>";
    
    var_dump(3==3);
    
    echo "<br>---------------<br>";
    
    var_dump(3==2);
    

    输出

    1
    ---------------
    
    ---------------
    
    boolean true
    
    
    ---------------
    
    boolean false
    

    没有输出的原因是你试图回显布尔值“false”,它什么也不打印。

    【讨论】:

    • 您基本上是在重申 OP 自己的观察结果而不解释 为什么 echo-ing 布尔值 false 打印一个空字符串,而不是 0
    • 我以为他认为这是不正确的行为。使用 var 转储,您可以看到它被正确分配为 false,但什么也不打印。这是预期的行为。
    • 但是你说得对,我也应该像其他人一样引用文档。
    • 好的,我知道你现在从哪里来。顺便说一句,我不一定认为引用文档是必要的。我只是认为 OP 可以对 echo false; 的行为方式进行更多解释。
    • 是的,我可以看到。我会把它储存在我的大脑中,以备下次使用。
    【解决方案3】:

    3 == 2 语句的计算结果为 false,正如 PHP 文档中 echo 的示例部分中所述,运行 echo false 不会打印任何内容,因为它在技术上不是一个函数。但是,您可以改用var_dump

    echo 3 == 2; // no output
    echo false; // no output
    
    var_dump(3 == 2); // outputs bool(false)
    var_dump(false); // outputs bool(false)
    

    【讨论】:

    • “运行 echo false 不会打印任何东西,因为它在技术上不是一个函数”:这不是原因,也不是你链接到的文档所说的。
    • @DecentDabbler 在 echo 文档的顶部,它说“echo 实际上不是一个函数(它是一种语言结构)”,后来在示例部分下的评论中说“因为 echo 不像函数一样,下面的代码无效”
    • 但是该示例根本没有说明与 OP 的问题相同的问题。该示例是关于在三元表达式(expression to evaluate ? if true expression : if false expression)中使用echo。这是一个完全不同的问题。
    【解决方案4】:

    关于为什么计算结果为echo false; 的语句打印空字符串的问题的实际原因在the documentation on strings 中给出,在section about casting to string 中:

    转换成字符串


    可以使用 (string) cast 或 strval() 函数。 字符串转换在 需要字符串的表达式的范围。这发生在 使用 echo 或 print 函数,或者将变量与 string. 类型和类型杂耍的部分将使 下面更清楚了。另请参见 settype() 函数。

    布尔值 TRUE 转换为字符串“1”。 布尔值 FALSE 转换为“”(空字符串)。这允许转换回来和 介于布尔值和字符串值之间。


    您无法以您尝试的方式测试未选中复选框的原因是浏览器不会在表单提交时发送未选中复选框状态。

    这个难题的典型解决方案是:

    1. 跟踪后端中所有可用的复选框,并在收到表单提交时进行比较。
    2. 在您的 HTML 表单中实际复选框之前添加一个隐藏字段,为其赋予与复选框相同的名称和一个表示未选中状态的值。

      <input type="hidden" name="checkbox1" value="0">
      <input type="checkbox" name="checkbox1" value="1">
      

      这些隐藏字段在表单提交时提交,如果选中1将被复选框值覆盖。


      1) 如果复选框被选中,两个值实际上都将被发送,但是如果它们具有相同的参数名称,PHP 将用稍后接收的值覆盖任何早期接收的值(除非参数名称表示一个没有显式键名,例如 name="checkbox[]" 而不是 name="checkbox[1]")。

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多