IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP中$a && $b = $c,$a || $b = $c语法的用法 -> 正文阅读

[PHP知识库]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);
    });
}

?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:12:05  更:2022-03-15 22:12:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:41:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码