所以今天,和往常一样,我在编程。按照我平常的工作,打字,听傻朋克和其他各种时髦的曲调。然后突然,我不得不写一些类似的东西:
$x = 'a'; // For instance
if ($x == 'a' || $x == 'b') {
// ...
}
很简单,我说的不是太寒酸。但是等等!我心想"there must be an easier way to do that - I'm repeating myself"
.所以我开始尝试使用以下代码来解决这个问题:
if ($x == ('a' || 'b')) {
// ...
}
但是,这行不通。完全。这总是真的。如果$x
等于a
,则b
、c
或cake
。所以我生闷气,哭了一下,决定问问Stackoverflow你们中是否有人知道为什么。
谢谢!
||
是逻辑或,它将左侧评估为布尔值('a'
,这在布尔上下文中true
(,如果这是真的,则返回true,如果不是,它对右侧做同样的事情。
var_dump('a' || 'b');
bool(true)
现在,将此值与字符进行比较,根据PHP(松散比较图表(的疯狂规则,该字符也将是正确的:
var_dump('a' == true);
bool(true)
你要求 PHP 评估 $x
是否等于 ('a' OR 'b')
的值,这将始终返回 true
,因为 'a' 和 'b' 都有非零值。
在这种情况下,您必须单独使用比较运算符,或者使用注释中 nickb 的建议。
它没有工作,因为
$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy
在这种情况下,字符串文本将转换为布尔值。
如果您在 if 中的$x
不是空字符串或其他被认为是虚假的字符串,它们将是相等的。
但是,您可以像这样写您的:
if (in_array($x, array('a', 'b', 'cake'))
如果你觉得这会让你的意图更清晰。
我会这样做:
$valid = array('a', 'b');
if (in_array($x, $valid)) {
...
}
足够简单!
。但是,回想起来,也许你不想要另一种方式来做到这一点?
您所知|| 是一个逻辑运算符,总是返回 true 或 false(在另一个单词 1 或 0 中(。所以,代码('a' ||'b'( 始终返回 true(1(。在上述情况下,$x包含值,因此由于自动类型会话$x也设置为 true(1(,因此它的 if(1 == 1( 并始终返回 true。
尝试使用波纹管代码
$x = false;
if ($x == ('a' || 'b')) { echo 'true'; } else{ echo 'false';}
始终返回 false。
了解 php 如何将字符串转换为布尔值
php > var_dump((bool) "a");
bool(true)
php > var_dump((bool) "b");
bool(true)
php > var_dump((bool) "cake");
bool(true)
所以基本上你问 php if($x == true(
请参阅 http://php.net/manual/en/types.comparisons.php