4

所以今天,就像每天一样,我在编程。继续我的日常工作,打字,听傻朋克和其他各种时髦的曲调。然后出乎意料,我不得不写一些类似的东西:

$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_ 所以我闷闷不乐,哭了一会儿,决定问 Stackoverflow 是否有人知道原因。ccake

谢谢!

4

7 回答 7

2

||是逻辑或,它将左侧评估为布尔值('a'在布尔上下文中true),如果为真则返回真,否则,它对右侧执行相同的操作。

var_dump('a' || 'b');
bool(true)

现在,将此值与一个字符进行比较,根据 PHP 的疯狂规则(松散比较图),该字符也是正确的:

var_dump('a' == true);
bool(true)
于 2012-07-30T18:32:00.480 回答
1

如你所知|| 是一个逻辑运算符,总是返回真或假(换句话说,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';}

总是返回假。

于 2012-07-30T18:52:15.947 回答
1

您要求 PHP 评估是否$x等于 的值('a' OR 'b'),这将始终返回,true因为 'a' 和 'b' 都具有非零值。

在这种情况下,您必须单独使用比较运算符,或者使用评论中 nickb 的建议。

于 2012-07-30T18:29:45.863 回答
1

它没有用,因为

$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy

在这种情况下,您的字符串文字将被转换为布尔值。

如果你$x的 if 不是空字符串或其他被认为是虚假的字符串,它们将是相等的。

但是你可以这样写你的 if:

if (in_array($x, array('a', 'b', 'cake'))

如果你觉得它让你的意图更清晰。

于 2012-07-30T18:31:54.967 回答
1

我会做:

$valid = array('a', 'b');

if (in_array($x, $valid)) {
    ...
}

够简单!

...但是,回想起来,也许你不想要另一种方式来做到这一点?

于 2012-07-30T18:32:49.397 回答
0

看看 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)

于 2012-07-30T18:32:05.543 回答
0

http://php.net/manual/en/types.comparisons.php

于 2012-07-30T18:32:17.777 回答