if语句对null变量表示true

时间:2017-02-01 00:35:12

标签: php

这里发生了什么?对我的大脑来说是迟到了吗?

我有一个包含 exaclty 以下代码的php文件。

<?php

$foo = 'foo';

$bar = null;

switch ($foo) {
    default:
    case 'foo':
        if ($bar) {
            echo 'true';
        } else {
            echo 'false';
        }
}

在浏览器中运行时打印true,但在命令行上运行时false ...如何?当我删除行default:时,我注意到它有效,但是整个switch语句应该如何与此相关?它仍然是一个简单的if (null) { doing this anyway }

PHP 7.0.13 的Apache / 2.4.18

是的......我清除了浏览器缓存,点击了ctrl + f5 ......我甚至更改了脚本文件名。

更新 在对这个简单文件进行更改后...(只是在末尾添加空格)并在浏览器中点击f5后,它再次显示false 一次而不是true ...不管我做什么。我真的不明白。

更新 我的PHP版本刚刚从7.0.13更新到7.0.15。猜猜是什么...仍然是相同的输出:

Apache / Browser:true

控制台:false

1 个答案:

答案 0 :(得分:1)

为此,您可以使用isset

<?php
$foo = 'bar';

$bar = null;

switch ($foo) {
    default:
    case 'bar':
        if (isset($bar)) {
            echo "true";
            die();
        } else {
            echo "false";
            die();
        }
}

此代码将回显false

你也可以使用double not运算符:

<?php
$foo = 'bar';

$bar = null;

switch ($foo) {
    default:
    case 'bar':
        if (!!$bar) {
            echo "true";
            die();
        } else {
            echo "false";
            die();
        }
}

default案例

的问题

在您提供的代码(以及我重新引用的代码)中,无论case 'bar'设置为什么,您每次都会点击$foo

<?php
$foo = 'notbar';

$bar = null;

switch ($foo) {
    default:
    case 'bar':
        if (!!$bar) {
            echo "true";
            die();
        } else {
            echo "false";
            die();
        }
}

此代码仍会回显false

您应该做的是在默认情况下包含break

<?php
$foo = 'notbar';

$bar = null;

switch ($foo) {
    default:
        echo "default";
        break;
    case 'bar':
        if (!!$bar) {
            echo "true";
            die();
        } else {
            echo "false";
            die();
        }
        break;
}

此代码将回显default,而不是其他任何内容。