表达式中的变量赋值如何工作?

2023-12-10

这是我以前见过的做法,但并不常见:在对值本身进行求值的同时将变量分配给一个值(或者是对表达式本身进行求值?)。例子:

// Outputs "The value is 1"
$value = 1;
if ($var = $value) {
    echo "The value is $var";
}

似乎与以下相同:

$value = 1;
$var = $value;
if ($var) {
    echo "The value is $var";
}

另一个例子:

// Outputs "The value is 1"
$value = 1;
echo "The value is ".$var = $value;

我一直在使用它来缩短我的代码,主要是第一个示例:用于评估第一个变量或表达式,同时将其分配给同一表达式中的另一个变量或表达式。像这样的事情:

if ($status = User::save($data)) {
    echo "User saved.";
}
// do something else with $status

这看起来很基本,但我实际上找不到任何文档对此,也许我不知道该去哪里寻找。在看到它多年后,我最近才弄清楚它是如何工作的,我真的很喜欢使用它,但我不想随意使用它。

它使代码更短,也许对某些人来说不太清楚,但绝对减少了重复性。这种方法有什么注意事项吗?这是否完全安全,或者是否存在可能失败或导致意外行为的情况?这似乎不是一种很常见的做法,所以我希望在开始“疯狂”之前找到一个解释。如果它is已记录,非常感谢指向正确页面的链接。


From https://www.php.net/manual/en/language.expressions.php:

PHP 使表达式更进一步,就像许多其他语言一样。 PHP 是一种面向表达式的语言,从某种意义上说,几乎一切都是表达式。考虑一下我们已经处理过的例子,$a = 5。很容易看出这里涉及到两个值,整数常量的值5,以及值$a也正在更新为 5。但事实是,这里还涉及一个额外的价值,那就是作业本身的价值。赋值本身的计算结果为指定值,在本例中为 5。实际上,这意味着$a = 5,无论它做什么,都是一个值为 5 的表达式。因此,写类似$b = ($a = 5)就像写作$a = 5; $b = 5;(分号标志着语句的结束)。由于分配是按从右到左的顺序解析的,因此您也可以编写$b = $a = 5.

许多人会认为你不应该经常使用这种行为。例如,区分:

if ($a == 5) { ... }

and

if ($a = 5) { ... }

很棘手!上面的两种常见的惯用写法是为了区分它们:

if (5 == $a) { ... }
if (($a = 5)) { ... }

第一个称为尤达条件如果省略等于字符,则会导致语法错误。后者在运行时不会有任何不同的行为,但当表达式没有额外的括号时,某些代码检查器会输出警告。

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

表达式中的变量赋值如何工作? 的相关文章

  • 如何从 URL 获取当前的 Web 目录?

    如果我有一个网址http www example com sites dir index html http www example com sites dir index html 我想提取 sites 这个词 我知道我必须使用正则表达式
  • MySQL LAST_INSERT_ID() 和 FOUND_ROWS()

    当 PHP 脚本每秒有数百个查询时会发生什么 它会影响这些函数吗 是否保证它们会返回当前脚本中最后一个插入语句中最后插入的 id 它会返回当前脚本中最后一次选择的行数吗 如果同时从另一个脚本进行新的插入或选择 在 FOUND ROWS 的情
  • 显示带有 id 的内部连接的名称[重复]

    这个问题在这里已经有答案了 我有这个查询 select from countrysegments inner join country on countrysegments country id country id inner join
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 使用 .htaccess 进行 PHP 设置时出现 500 内部服务器错误

    当我使用时 htaccess对于以下 PHP 设置 我得到500 Internal Server Error访问网站时 中的代码 htaccess file php flag display errors off php flag log
  • CodeIgniter加入选择为

    我的数据库中有 2 个表需要加入 一张表是 artikelen 表 另一张表是 Collections 表 我目前有 this gt db gt select this gt db gt from collecties this gt db
  • php / phpDoc - @return $this 类的实例?

    如何在 phpDoc 中将方法标记为 返回当前类的实例 在下面的示例中 我的 IDE Netbeans 将看到 setSomething 始终返回foo object 但如果我扩展对象 情况就不是这样了 它会返回 this 在第二个示例中是
  • 测试 CodeIgniter 会话变量的正确方法是什么?

    获取以下代码片段 测试确保会话变量不为空的最佳方法是什么 如果稍后在我的脚本中 我调用以下内容 第一个打印正确 但在第二个我收到消息 未定义的变量 已登录 我尝试过使用 empty and isset 但两者均未成功 我还尝试使用向后执行
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • Cron 作业的远程地址问题

    我需要获取访问者的IP 但是当cron运行时 它发现REMOTE ADDR是一个未定义的索引 事实上 当文件与 cron 一起运行时 没有远程地址 我该如何避免这个问题 PHP 有没有办法说 如果 REMOTE ADDR 存在则考虑它 如果
  • 根据product_id获取magento产品的浏览次数

    我想在 Magento 的类别列表页面上显示查看计数 这些数据看起来过去可以通过 reports product collection 访问 但我找不到正确访问它的方法 我基本上想提供一个产品 ID 并获取返回给我的所述产品的观看次数 您可
  • 不区分大小写的 array_unique

    我正在尝试编写几行代码来创建一个不区分大小写的数组唯一类型函数 这是我到目前为止所拥有的 foreach topics as value lvalue strtolower value uvalue strtolower value if
  • Symfony 4 生产模式错误处理页面内存耗尽

    我将我的项目设置为prod模式在 env除了自定义错误页面之外的所有内容似乎都有效 我将此作为我的 404 树枝模板 templates bundles TwigBundle Exception error404 html twig inc
  • 一次用 \r\n & \n & \r 分解字符串? [复制]

    这个问题在这里已经有答案了 我想按行分割字符串 但我希望它基于所有主要使用的换行符 n r n r 并返回一个包含每一行的数组 您可以使用正则表达式和preg split http php net preg split反而 lines pr
  • 如何处理致命错误:cURL错误7:无法连接到xxxx端口443

    我有一个连接到第三方 API 的脚本 它是并且应该在 24 7 不间断循环上运行 我在重新启动循环之前在最后使用睡眠 问题是 有时第三方 API 会被拒绝 或者连接会因以下错误而中断 致命错误 未捕获的异常 GuzzleHttp Ring
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • 即使在双引号内或使用 PHP_EOL,PHP echo 也不打印换行符

    这是一张照片剪辑 我认为它很清楚 这真让我抓狂 我似乎无法让 php 在我的本地主机 使用 xampp 或在线 PHP 解释器上打印换行符 如果你想在 php 中使用 HTML 标签 试试这个 echo dkljaks aalksja kl
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • Laravel 4.2 Composer 安装错误:“无法扫描类”

    我想通过 Composer 在新的 Laravel 4 2 安装上安装一些软件包 但是 我遇到了例外 这是我的作曲家文件 name laravel laravel description The Laravel Framework keyw
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但

随机推荐

  • 无法使用 PHPMailer 通过 Google SMTP 发送邮件

    我正在尝试使用 Google 的 SMTP 与 PHPMailer 结合发送邮件 但我无法让它工作 这是我的代码 mail gt IsSMTP mail gt Host smtp gmail com mail gt SMTPAuth tru
  • 如何使用 WMI 列出设备类型?

    我正在使用 WMI Code Creator 生成代码来帮助列出设备管理器中显示的设备类型 我正在尝试检测是否存在以自己的类型显示在设备管理器中的调试器 例如 在我的计算机下列出 类别为计算机 磁盘驱动器 显示适配器 Jungo Jungo
  • 如何在 Windows 上使用 MinGW 构建 OpenCV 3.2.0 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 这篇文章包含了我 和其他用户 在从源代码构建库时遇到的所有问题 由于没有教程 我决定创建此类常见问题解答帖子 将所有解决方案放在一起 希望它会有所帮助 配置 OpenCV 3 2
  • 需要获取字符串中第二个破折号之后的所有内容吗?

    我有如下的字符串值 string str1 123 456 test string str1 123 456 test test string str1 123 REQ456 test string str1 123 REQ456 test
  • Scala:列表[Future]到Future[List],忽略失败的未来

    我正在寻找一种将任意长度的 Future 列表转换为 Future of 列表的方法 我正在使用 Playframework 所以最终我真正想要的是Future Result 但为了让事情变得更简单 我们只是说Future List Int
  • Java 十进制格式 - 与给定的精度一样

    我正在与DecimalFormat 我希望能够以给定的精度读取和写入小数 我正在转换为BigDecimal 本质上 我想要一个DecimalFormat它强制执行以下模式 d d 即 至少一位数字 然后可选地 小数点分隔符后跟至少一位数字
  • 在 WPF 中填充数字显示

    我有一个非常简单的位置读数 它只是一个应用了样式的 TextBlock 在那种样式中 我只是这样设置 还有比这更多的属性 但为了简洁我把它们去掉了 现在 我有一个使用这种样式的显示器 它将显示 0 0 到 30000 0 之间的数字 问题是
  • 如何让 VLC 因预取错误而关闭?

    Python 2 7 lib vlc 不断打印 00000000081257d0 prefetch stream error unimplemented query 264 in control每当有新歌响起时 p play 导致了这个问题
  • 使用自修改代码观察 x86 上的陈旧指令获取

    我被告知并从英特尔手册中读到 可以将指令写入内存 但指令预取队列已经获取了过时的指令并将执行这些旧指令 我未能成功观察到这种行为 我的方法如下 英特尔软件开发手册第 11 6 节指出 对当前缓存在处理器中的代码段中的内存位置进行写入会导致关
  • 如何在 Neo4j 中使用 SSL 证书代替自签名证书(或 Snakeoil.cert)

    对于生产 Neo4j 服务器 我需要使用非自签名的 SSL 证书 我将在下面的回复中发布经验教训 sudo vi etc neo4j neo4j server properties uncomment org neo4j server we
  • MySql 嵌套 SP 会成为瓶颈吗?

    我们有这个 MySQL SP 它调用嵌套 SP 看起来它在负载下表现不佳 该 SP 在负载下可能会变慢 因为它调用嵌套 SP 并使用临时表将数据传递到主 SP DELIMITER drop procedure if exists GeoAr
  • SWT 浏览器无法运行?

    我在使用 SWT 浏览器组件时遇到了一些问题 我正在运行 Ubuntu 11 04 AMD64 和 Eclipse 3 7 以及 Sun 的 Java SE 1 6 我的问题是我的浏览器无法初始化 当我使用 SWT NONE 标志时 出现错
  • Symfony2 表单和 Doctrine2 - 更新指定实体中的外键失败

    我有个人资料和研究 一个人可以完成多项学业 表单正确呈现 有一个按钮 添加新研究 使用 jQuery 我添加了另一个基于数据原型的子表单 效果很好 当我提交带有新子表单的此类表单时 出现数据库错误 Integrity constraint
  • 如何选择最佳的自动化工具与硒的组合[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 这可能是基于意见的问题 但我对选择自动化工具组合感到非常困惑 到目前为止 我一直在使用 Selenium webdriver maven 和 Java 来构建自动化框架 这看起来完全工作正
  • 如何在谷歌应用程序脚本中的表单项中获取图像

    我有多个多项选择题和其中包含图像的复选框 我正在尝试将所有问题编译成一个文档文件 如何获取问题中的图像 它们不在单独的图像项中 https docs google com forms d 1qdqNcaaiKxOoi4IiNc 3xcr1X
  • MySQL - 使用触发器复制表

    我正在尝试复制一个表with触发器 我知道我以前这样做过 只是不记得我是如何做到的以及在哪里学会了如何做到这一点 我试过了CREATE TABLE newname LIKE oldname and CREATE TABLE newname
  • 找出哪个类调用了另一个类中的方法

    PHP 有没有办法找出哪个对象调用了另一个对象中的哪个方法 Exmaple class Foo public function construct bar new Bar bar gt test class Bar public funct
  • 使用 Apache FOP 添加 PDF 可填写表单 (acrofield)

    我正在尝试将可填写的表单 以便最终用户可以使用 acrobat reader 将信息插入其中 然后保存 添加到我使用 Apache FOP 生成的 PDF 中 如果可能的话 我似乎找不到任何有关如何完成此操作的信息 Google 没有提供太
  • android 改造将数组发送为 x-www-form-urlencoded

    我正在使用 Retrofit 作为我的网络库 并且我想发送一个 JSON 数组作为x www form urlencoded 但我不知道该怎么做 这是我的请求 API POST book FormUrlEncoded Call
  • 表达式中的变量赋值如何工作?

    这是我以前见过的做法 但并不常见 在对值本身进行求值的同时将变量分配给一个值 或者是对表达式本身进行求值 例子 Outputs The value is 1 value 1 if var value echo The value is va