可以($ a == 1&& $ a == 2&& $ a == 3)评估为真吗?

时间:2018-01-19 07:59:27

标签: php

与针对javascript的此问题here类似,它为各种不同语言产生了大量spin-offs。我很好奇以下是否可以在PHP中评估为真:

($a == 1 && $a == 2 && $a == 3)

为了进一步跟进,似乎simply setting $a = true将产生所需的结果(这不是javascript的情况,因为类型转换在两种语言中的工作方式)。一些答案(在javascript中)也适用于===,因此在PHP中使用类型检查(===),以下内容是否会产生真实效果?

($a === 1 && $a === 2 && $a === 3)

3 个答案:

答案 0 :(得分:8)

我刚试过这个:

$a = true;
echo ($a == 1 && $a == 2 && $a == 3);

它回应了1

由于类型转换而不是类型检查,与布尔值比较时,1,2,3将被视为true

回答编辑:不能无法完成。

@FrankerZ评论的

Hackish method

零字节字符= 0xFEFF

http://shapecatcher.com/unicode/info/65279

http://www.unicodemap.org/details/0xFEFF/index.html

$var  = "1";
$var = "2";
$ var = "3";

echo ($var  === "1" && $var === "2" && $ var === "3") ? "true" : "false";

此代码使用此字符运行,因为名称$ var$var 似乎对PHP编译器有效,并且使用适当的字体,它可以隐藏。它可以用 Alt + 6 5 2 7 9来实现在Windows上。

答案 1 :(得分:3)

虽然没有严格遵守这个问题,但如果整数用引号括起来,可以这样做:

tuple

答案 2 :(得分:2)

我无法想象严格比较会产生真实的情况。 ===运算符首先比较类型,因此无法使用任何魔法方法。

对于好奇心,我最接近的是稍微修改设置并在tick函数中破解变量。由于每个语句只增加了滴答,我们必须将比较分解为多个语句才能生效。

$a = 1;
register_tick_function(function () use (&$a) {
    ++$a;
});
declare(ticks = 1) {
    $a === 1 or exit(1);
    $a === 2 or exit(1);
    $a === 3 or exit(1);
}
echo "a = $a\n";

Try it online