在 if() 块中分配多个变量时出现意外行为

2024-02-02

本着看的精神像Python的“and”一样的短路评估,同时存储检查结果 https://stackoverflow.com/q/39603391/2191572我决定看看如何在 PHP 中最好地解决这个问题,但我遇到了一个问题。

意外

<?php
function check_a()
{
    return 'A';
}
function check_b()
{
    return 'B';
}
function check_c()
{
    return 'C';
}

if($a = check_a() && $b = check_b() && $c = check_c())
{
    var_dump($a);
    var_dump($b);
    var_dump($c);
}

结果是:

bool(true)
bool(true)
string(1) "C"

我想要发生的事情的代码

<?php
function check_a()
{
    return 'A';
}
function check_b()
{
    return 'B';
}
function check_c()
{
    return 'C';
}

// if(($a = check_a()) && ($b = check_b()) && $c = check_c()) // equivalent to line below
if(($a = check_a()) && ($b = check_b()) && ($c = check_c()))
{
    var_dump($a);
    var_dump($b);
    var_dump($c);
}

结果是:

string(1) "A"
string(1) "B"
string(1) "C"

为什么意外例如以这种方式行事?


这是一个问题运算符优先级 http://php.net/manual/en/language.operators.precedence.php. An 赋值表达式返回指定的值 http://php.net/manual/en/language.operators.assignment.php,所以你会期望得到A and B对于前两个操作。你得到布尔值的原因true相反的是&&运算符的优先级高于赋值运算符,因此在原始表达式中

$a = check_a() && $b = check_b() && $c = check_c()

$a得到的值check_a() && $b = check_b() && $c = check_c(),

$b得到的值check_b() && $c = check_c(),

and $c得到的值check_c().

表达式check_a() && $b = check_b() && $c = check_c(), and check_b() && $c = check_c()返回布尔值true,因为使用&&运算符导致表达式被计算为布尔值,并且表达式的所有组件由&&评估为true.

为了获得您期望的结果,您可以像以前一样添加括号,or你可以使用and逻辑运算符代替&&,因为它的优先级低于赋值运算符。

if($a = check_a() and $b = check_b() and $c = check_c()) {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 if() 块中分配多个变量时出现意外行为 的相关文章

  • 用于分页的php示例脚本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以建议一个好的分页 php 脚本 其中人们想要分页显示数据库中的大量项目 以下链接可以帮助您
  • 当存在联系时如何为数组分配排名号

    当尝试为数组中存在平局的数值分配排名时 我很难知道从哪里开始 因此 例如 我需要像下面这样转换一个数组 myarray 4 76 34 13 34 到另一个数组中 例如 myarray2 1 5 3 5 2 3 5 基本上 当相同的数字在数
  • 如何将 Filesystem 类的 glob 方法与 StorageFacade 结合使用?

    这涉及到拉拉维尔 5 我可以看到Illuminate Filesystem Filesystem一个方法叫做glob pattern flags 0 不幸的是 这个方法并没有体现在默认的情况下FilesystemAdapter随 Larav
  • 如何在 标签中用 %20 替换空格

    我想替换 html 文本的图像标签中的所有空格 Example img src to img src photo 201 jpg 我没有找到 preg replace 的解决方案 但它可能是一个简单的正则表达式行 谢谢 Edit 抱歉各位
  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • 如何从 Laravel 5 中的 Public/Images 文件夹中删除图像(URL 数据)

    如何从 laravel 5 中的 public images 文件夹中删除图像文件 我从这个网站找到了一些例子 但我知道他们只是在他们的文件中使用文件名record table 但我正在使用类似的东西URL e g localhost pr
  • PHP 警告 ZipArchive::extractTo():权限被拒绝

    我创建了一个应用程序 它使用 ZipArchive 类 php 中的标准 中的方法 extractTo 并在 Windows 7 上的本地主机 apache 服务器上对其进行了测试 没有任何问题 但是当我在一些unix生产服务器上尝试过它之
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • 如何在javascript中使用自动递增id?

  • PHP header() 和 jquery mobile

    我想使用 php header Location newpage php 进行重定向 我没有收到错误 但 Jquery mobile 似乎无法加载目标页面 并且地址栏仍保留旧地址 请问您有什么建议吗 Thanks 尝试添加data ajax
  • WAMP 不显示目录列表中的图标

    过去 我通过 vmware 处理 PHP 代码 但最近我决定转而通过 WAMP 在 Windows 8 1 上 在本地进行处理 我创建了一个空文件夹tests in the www folder 然后在我的浏览器上输入http localh
  • 需要 mysqli_fetch_all 的替代方案

    我有一个 php mysqli 代码 可以找到一个我的本地服务器 但是在我的服务器上使用它时 我得到了一个 Fatal error Call to undefined function mysqli fetch all in home3 t
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • 需要使用 php 从远程服务器下载与 $_FILES 相同的内容[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 好的 我有处理图像上传的 php 代
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que

随机推荐

  • 我正在使用 Redux。我应该管理 Redux 存储中的受控输入状态还是在组件级别使用 setState?

    我一直在试图找出管理我的反应表单的最佳方法 我尝试使用 onChange 来触发操作并使用表单数据更新我的 redux 存储 我还尝试创建本地状态 当提交表单时 我触发并执行操作并更新 redux 存储 我应该如何管理我的受控输入状态 我喜
  • NodeJS 套接字有时可以工作

    因此 我有一个节点服务器 运行expressjs io 使用socket io 并且我正在构建一个跟踪数据库中坐标的网格地图 只是 我遇到了一个特殊的问题 因为我的套接字只监听有时 起初没有错误消息 只是偶然我让页面运行并收到此错误 Unc
  • 内核和用户模式之间共享内存。如何共享句柄?

    我正在尝试在用户进程和内核之间使用共享内存 选项一 让内核创建部分并让用户模式应用程序通过名称 Global my mem 打开内存 它仅在只读模式下工作 当我尝试使用 FILE MAP WRITE 打开部分时 它会拒绝访问 5 不确定如何
  • EF 向后兼容数据库迁移

    我试图弄清楚如何使用 EF 代码优先和迁移来实现以下部署场景 我的想法是 我想通过向后兼容的架构更改来升级数据库 例如 添加一列 并测试一切是否仍然有效 它受到绿色 蓝色部署的启发 但并不完全遵循该模式 这背后的原因是遵循这个过程 升级数据
  • 为什么 Chrome 中的页面上没有加载所有视频?

    http graysonearle com bluemen http graysonearle com bluemen 使用 webkit 浏览器单击它 加载时应该会出现 4x4 的视频网格 但 Chrome 上往往只会加载 1 3 个视频
  • 如何查询android设备硬件信息

    我如何获取 Android 设备硬件信息 如 CPU 架构 速度 霓虹灯 GPU 名称 制造商 RAM 大小 我希望有一种方法可以使用 ndk 本地执行此操作 但如果只能通过 java 代码实现 那么如何执行此操作 您需要使用Build h
  • 尝试使用嵌套属性制作表单

    我是 Rails 的初学者 所以我对嵌套属性很困惑 以下是我正在寻找的内容的概述 租车可以创造汽车 完成 客户可以预订汽车 租赁汽车在预订的同时创建客户 我正在尝试制作一份预订表格 其中包含客户和预订信息 因为租赁汽车将填写所有信息 这就是
  • 如何知道 nuget 包是否可以在 .NET Core 上运行?

    我希望网站或控制台中存在某种过滤器 不幸的是 现在这并不容易 有一个NuGet Github 上开放的问题 https github com NuGet NuGetGallery issues 3098关于向网站添加过滤器 目前 判断包是否
  • RichTextBox 和 Tab 键

    我创建了一个 richTextBox 我注意到当我按 Tab 键时它没有执行任何操作 它应该做一些空间 但它没有 我怎样才能访问它 默认情况下 按 Tab 键会将焦点移至下一个控件 将 RichTextBox 的 AcceptsTab 属性
  • MarkLogic 9 cts.parse 无法正确解析查询

    我正在使用 MarkLogic 9 开发基于 Web 的搜索应用程序 我有一个查询构建界面 允许用户将字符串输入到与数据库中文档的特定 JSON 属性相对应的文本框中 这个想法是 用户可以完全按照 cts parse 我使用服务器端 jav
  • 最外面的 CascadingValue 在页面刷新或直接链接时丢失

    我想在我的 Blazor 应用程序中共享几个组件 这些恰好是 SyncFusion 组件 一个是 SfToast 一个是 SfDialog 我认为一个简单的方法是将组件放在 MainLayout razor 上 然后使用
  • 如何“检查”函数是否确实给出随机结果?

    如何确定一个函数确实是随机的或者尽可能接近这个概念 另外 随机和伪随机之间有什么区别 最后 可以使用哪些算法 来源来生成随机数 P S 也问这个是因为 MySQL 语句使用ORDER BY RAND LIMIT 1没有给出令人信服的结果 随
  • 抽象类的可访问性不一致

    我有一个内部抽象类InternalClassBase和两个 也是内部 类InternalClass1 and InternalClass2 继承自InternalClassBase 我还有一个公共抽象类PublicClassBase和两个
  • 使用 Java 解析包含转义字符的字符串

    我想知道是否有人可以帮助我弄清楚如何解析具有以下格式的字符串 field1 field2 fieldN field1 field2 fieldN 每条记录均以 分隔记录中的每个字段均以 分隔 复杂的是各个字段可能包含转义分隔符 例如 或者
  • D3.js 如何旋转路径上的文本

    这是我的第一个 D3 项目 我不是程序员 所以一次性学习所有内容 我正在尝试制作一个圆形日历 我已经手绘了好几年了 这是一个巨大的痛苦 大多数位现在都可以工作 但我不知道如何将文本旋转 90 度在这条弧线上 一旦我转动了文本 我就需要弄清楚
  • 创建算法=未定义的定义器

    我从远程服务器备份了一些数据库 当我尝试导入该备份时 我的本地服务器遇到了问题 我在这一行收到错误 CREATE ALGORITHM UNDEFINED DEFINER root SQL SECURITY DEFINER VIEW tema
  • 如何重塑数据集(从长到宽),每个类别有两个测量列,而无需在 R 中进行额外计算

    我有长格式的数据集 请参阅下面的代码来生成此数据集 region week average percent A 20 5 30 A 21 7 40 A 22 15 50 B 20 4 15 B 21 8 27 B 22 3 11 我想准备它
  • 如何通过两个属性和排序器对对象列表进行排序

    我必须按姓氏和名字对对象列表进行排序 如果多个对象有相同的姓氏 我还必须对这些应用 Collat or 假设我可以对一个属性执行此操作 val collator Collator getInstance context getResourc
  • 如果在添加注释时缩放,MKMapView 会崩溃

    看来我遇到了一个问题 我可以可靠地导致我的MKMapView如果我在更改地图的可见区域时添加注释 则会崩溃 我已经将导致它的代码简化为一个非常简单的实现 并且我在这里重现它 NSMutableArray pointAnnotationArr
  • 在 if() 块中分配多个变量时出现意外行为

    本着看的精神像Python的 and 一样的短路评估 同时存储检查结果 https stackoverflow com q 39603391 2191572我决定看看如何在 PHP 中最好地解决这个问题 但我遇到了一个问题 意外