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