PHP中$a && $b = $c,$a || $b = $c语法的用法

在维护别人的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 是如何进行逻辑运算处理呢?假设如下

  1. $a && $b = $c   实际上是 (X && Y) 的运算形式 X且Y都为真才可以进行赋值运算。那么Y为$b = $c,必然为true,只要X即$a为true ,那么Y就可以执行赋值。即&& 左侧为真,右侧才可以判断;否则&&左侧为假,右侧不执行操作直接跳过。虽然"&&"比"="优先级高,但不按照此运算来。
  2. $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);
    });
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值