在PHP中通过AND运算符进行短路评估

在PHP中通过AND运算符进行短路评估,php,and-operator,Php,And Operator,我正在努力提高我的ninja h4x编码技能,目前我正在研究不同的框架,我发现谷歌很难找到示例代码 我正在看一个项目中使用的 我不了解的样本是 $data and $this->template->set_global($data); 和关键字在这行代码中做了什么?框架中有很多地方都使用它,这是我发现的第一个使用它的地方。这是一种类型的“”。和/&&意味着比较的两边都必须计算为TRUE 和/&&左侧的项目评估为TRUE/FALSE,如果TRUE,则执行并评估右侧的项目。如果左侧项目

我正在努力提高我的ninja h4x编码技能,目前我正在研究不同的框架,我发现谷歌很难找到示例代码

我正在看一个项目中使用的

我不了解的样本是

$data and $this->template->set_global($data);
关键字在这行代码中做了什么?框架中有很多地方都使用它,这是我发现的第一个使用它的地方。

这是一种类型的“”。
和/&&
意味着比较的两边都必须计算为
TRUE

和/&&
左侧的项目评估为
TRUE/FALSE
,如果
TRUE
,则执行并评估右侧的项目。如果左侧项目为
FALSE
,则执行将停止,并且不会计算右侧项目

$data = FALSE;
// $this->template->set_global($data) doesn't get evaluated!
$data and $this->template->set_global($data);

$data = TRUE;
// $this->template->set_global($data) gets evaluated
$data and $this->template->set_global($data);

注意,这些值不必是实际的布尔值
TRUE/FALSE
,但也可以是符合PHP求值规则的truthy/falsy值。有关评估规则的更多信息,请参阅。

这是一条有效的语句,其工作原理如下:

如果$data有效(不是“”、0或NULL),则运行$this->template->set\u global($data)

这是一个简单的说法:

if ($data)
{
    $this->template->set_global($data);
}
顺便说一句,您也可以使用
&&
而不是

它是一个值,这意味着它需要两个操作数并返回一个布尔值--
true
false
。如果两个操作数的计算结果均为
true
(PHP中除了和空字符串、零或null以外的任何值),它将返回
true
,否则结果将为
false

以下是PHP关于
操作符的官方文档:


当您使用逻辑运算符时,操作数(左边的值和右边的值)计算为布尔值,因此基本上代码将以较短的方式执行此操作:

$o1 = (Bool)$data; // cast to bool
if($o1)
    $o2 = (Bool)$this->template->set_global($data); // cast to bool
编辑:

一些补充资料:

$a = 33;
isset($a) && print($a) || print("not set");
echo "<br>";
isset($a) AND print($a) OR print("not set");
echo "<br>";
$a=33;
isset($a)和打印($a)|打印(“未设置”);
回声“
”; isset($a)和print($a)或print(“未设置”); 回声“
”;

尝试注释/取消注释
$a=33。这就是
&
之间的区别,以及
|
之间的区别(
print
在转换为字符串时返回转换为“1”的true)。

PHP对逻辑and操作既支持
&
又支持
,并且它们通常工作相同,除了
的运算符优先级略低于
和&

错误之外,如果使用
|
,仅当左侧不真实时,它才会计算右侧。您误解了问题您误解了问题,即使它没有直接解决问题,+1用于提及优先级差异。
$a = 33;
isset($a) && print($a) || print("not set");
echo "<br>";
isset($a) AND print($a) OR print("not set");
echo "<br>";