在维护别人的PHP项目的时候,发现
$agent_id && $agentCompaniesModel = $agentCompaniesModel->where('id', $agent_id);
$media_id && $agentCompaniesModel = $agentCompaniesModel->whereHas('media', function ($query) use ($media_id) {
$query->where('medias.id', '=', $media_id);
});
?????????这时候有点摸不着头脑,因为“&&”优先级是比“=”要高的,那么$a && $b = $c,即为1 = $c,
并且发现实际逻辑并非如此。
// &&
$ckfid && $rs=$db->get_one("SELECT * FROM $table WHERE fid='$ckfid'");
其实这句话相当于只有当$ckfid不为空的时候 才执行后面的 也就是约等于
if ($ckfid) {
$rs=$db->get_one("SELECT * FROM $table WHERE fid='$ckfid'");
}
// ||
$ckfid || $rs=$db->get_one("SELECT * FROM $table WHERE fid='$ckfid'");
其实这句话相当于只有当$ckfid为空的时候 才执行后面的 也就是约等于
if (!$ckfid) {
$rs=$db->get_one("SELECT * FROM $table WHERE fid='$ckfid'");
}
那么问题来了,$a && $b = $c 是如何进行逻辑运算处理呢?假设如下
- $a && $b = $c? ?实际上是 (X && Y)?的运算形式 X且Y都为真才可以进行赋值运算。那么Y为$b = $c,必然为true,只要X即$a为true ,那么Y就可以执行赋值。即&& 左侧为真,右侧才可以判断;否则&&左侧为假,右侧不执行操作直接跳过。虽然"&&"比"="优先级高,但不按照此运算来。
- $a && $b = $c 是先进行&&运算,再进行赋值操作,即先($a && $b),再执行($b = $c)。
?那么同理,$a || $b = $c应该也拥有相应的假设,我们直接用样例进行验证
<?php
$a = 1;$b = 2;$c = 3;
$a && $b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
echo '</hr>';
//这样是
//a:1 b:3 c:3
$a = 0;$b = 2;$c = 3;
$a && $b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
echo '</hr>';
echo '<br>';
echo "PHP_EOL";
/*
这样是
a:0 b:2 c:3
解析:
1: && 和赋值运算符“=”的优先级是&&优先级高,但是有"&& ="的写法中并不是 $a和$b先做与运算然后 =$c,这么理解相当于 1=$c, 而 1=$c这样的写法显然是错误的,你想过1的感受吗!不管$c是什么都要强加给她!她还是个孩子啊!看看她笔直的身材,要是S型就好了.--!
2: 这种另类的写法正确的理解方式为:
$a代表字符a, $b代表字符b
$a && $b 代表字符a与字符b进行逻辑与运算
&&与运算,同真时结果为真,再执行赋值语句$b = $c.否则结果为假
*/
//第1题:
$a = 1;$b = 2;$c = 3;
$a ||$b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
echo '</hr>';
//这样是a:1b:2c:3
//第2题:
$a = 0;$b = 2;$c = 3;
$a || $b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
echo '</hr>';
//这样是a:0b:3c:3
//第3题:
$a = 0;$b = 0;$c = 5;
$a ||$b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
//这样是a:0b:5c:5
//第4题:
$a = 1;$b = 0;$c = 5;
$a ||$b = $c;
echo "a:$a";
echo "b:$b";
echo "c:$c";
//这样是a:1b:5c:5
/*
解析:
$a||$b = $c ,||是或运算,||两侧一个为真时即可,当$a为真时,系统按照顺序判断||左侧的$a,若$a为假,($b = $c)才会执行,若为真,则($b = $c)不执行直接跳过
*/
结论:
说明假设1是正确的
$a && $b = $c 实际上是if($a){ $b = $c},而不是先($a && $b),再执行($b = $c)
$a ||?$b = $c 实际上是if(!$a){ $b = $c},而不是先($a ||?$b),再执行($b = $c)
那么
$agent_id && $agentCompaniesModel = $agentCompaniesModel->where('id', $agent_id);
等同于
if($agent_id){
$agentCompaniesModel = $agentCompaniesModel->where('id', $agent_id);
}
$media_id && $agentCompaniesModel = $agentCompaniesModel->whereHas('media', function ($query) use ($media_id) {
$query->where('medias.id', '=', $media_id);
});
等同于
if($media_id){
$agentCompaniesModel = $agentCompaniesModel->whereHas('media', function ($query) use
($media_id) {
$query->where('medias.id', '=', $media_id);
});
}
?
|