【发布时间】:2013-07-07 08:12:08
【问题描述】:
我发现自己经常做这种事情:
$foo = true;
$foo = $foo && false; // bool(false)
使用位运算符,您可以使用&= 和|= 速记:
$foo = 1;
$foo &= 0; // int(0)
鉴于1 和0 上的按位运算在功能上等同于true 和false 上的布尔运算,我们可以依靠类型转换并执行以下操作:
$foo = true;
$foo &= false; // int(0)
$foo = (bool)$foo; // bool(false)
...但这很丑陋并且违背了使用速记赋值语法的目的,因为我们必须使用另一个语句来将类型恢复为布尔值。
我真正想做的是这样的:
$foo = true;
$foo &&= false; // bool(false)
...但是 &&= 和 ||= 显然不是有效的运算符。所以,我的问题是 - 是否有其他一些含糖的语法或者可能作为替代品的晦涩的核心功能?对于像 $foo 这样短的变量,只使用 $foo = $foo && false 语法没什么大不了的,但是具有多个维度的数组元素和/或对象方法调用会使语法变得很长。
【问题讨论】:
-
$foo = $foo && false; 有什么问题?还是只是好奇?
-
@DanyCaissy:我在最后一段中解释过。它没有任何错误;只是该语法是多余的,并且可能会变得非常冗长(例如
$some['big']['long']['variable'] = $some['big']['long']['variable'] && $some['other']['boolean'];)。 -
你可能想改变你的例子。从逻辑上讲,这些总是会产生相同的结果 =
$foo &= false;和$foo &&= false;对于$foo = true。所以我没有看到问题/目标。 -
@JasonMcCreary:这取决于您对“相同”的定义。正如我的例子所指出的,前者产生
int(0),后者产生bool(false)。所以虽然0 == false因为隐式类型转换,0 !== false. -
这仍然是 7 年后的 PHP7/8 类型强制检查。如果使用短语法,很容易意外地从 bool 转换为 int。
标签: php syntax boolean-logic syntactic-sugar