为什么 PHP 认为 0 等于字符串?

2023-11-23

我有以下代码:

$item['price'] = 0;
/* Code to get item information goes in here */
if($item['price'] == 'e') {
    $item['price'] = -1;
}

其目的是将商品价格初始化为 0,然后获取有关它的信息。如果价格被告知为“e”,则意味着交换而不是卖出,它以负数存储在数据库中。

也可以将价格保留为 0,因为该物品是奖励,或者因为价格将在稍后设置。

但是,每当价格未设置时,其初始值为 0,if上面所示的循环评估为 true,价格设置为 -1。也就是说,它认为 0 等于“e”。

这该如何解释呢?

当价格提供为 0 时(初始化后),行为不稳定:有时 if 计算结果为 true,有时计算结果为 false。*


你正在做==它会为您整理类型。

0是一个 int,所以在这种情况下它将进行强制转换'e'到一个整数。哪一个不能被解析为一个,并且会变成0。一个字符串'0e'会成为0并且会匹配!

Use ===

From PHP.net:

使用 == 和其他非严格比较字符串和数字 比较运算符目前通过将字符串转换为数字来工作, 然后对整数或浮点数进行比较。这 得出许多令人惊讶的比较结果,其中最值得注意的是 即 0 == "foobar" 返回 true。

然而这种行为被改变了PHP 8.0:

与数字字符串进行比较时,PHP 8 使用数字比较。 否则,它将数字转换为字符串并使用字符串 比较。

PHP 7

0 == 'foobar' // true
0 == '' // true
4 == '4e' // true (4e is cast as a number and becomes 4)

PHP 8 在进行比较之前将数字转换为字符串

0 == 'foobar' // false
0 == '' // false
4 == '4e' // false ('4e' is considered non-numeric therefore 4 is cast as a string and becomes '4')

这是一个重大更改,因此它是在新的主要 PHP 版本中实现的。此更改破坏了依赖于旧行为的脚本的向后兼容性。

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

为什么 PHP 认为 0 等于字符串? 的相关文章

  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • PHP 可以解压缩使用 .NET GZipStream 类压缩的文件吗?

    我有一个 C 应用程序 它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可 我现在正在开发一个反馈系统 供用户通过软件自动提交错误和跟踪日志 根据我之前发布的问题 我认为 Web 服务将是实现此目的的最佳方法 最有可能以最
  • 如何在 Yii2 应用程序中显示多个选择下拉列表中的选定值?

    我正在研究 Yii2 我正在使用这样的自定义数组创建多个选择下拉菜单 在控制器文件中 all groups Groups find gt where group created by id gt orwhere new Expression
  • 在 Java 中比较字符串的最快方法是什么?

    在Java中比较两个字符串最快的是什么 有比等于更快的东西吗 编辑 我无能为力澄清这个问题 我有两个字符串 它们按字母顺序排序并且大小完全相同 示例 abbcee 和 abcdee 字符串最长可达 30 个字符 我不认为Sun Oracle
  • 如何处理PDO异常[重复]

    这个问题在这里已经有答案了 我正在尝试与PDOphp 上的类 但我在找到处理错误的正确方法时遇到了一些麻烦 我编写了以下代码
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 为什么使用 string::iterator 而不是索引? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么使用迭代器而不是数组索引 https stackoverflow com questions 131241 why use iterators instead of array indices
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • 如何从文件中获取整个函数

    好的 我现在正在逐行阅读一个文件 我知道文件中的每个函数名称 因为它是在 XML 文档中的其他位置定义的 应该是这样的 function function name 其中 function name 是函数的名称 我从 XML 文档中获取所
  • 如何从字符串中分离字符和数字部分

    例如 我想分开 OS234 to OS and 234 AA4230 to AA and 4230 我使用了以下简单的解决方案 但我确信应该有一个更有效和更强大的解决方案 private void demo string cell ABCD
  • 类 Doctrine\Common\Collections\ArrayCollection 不是有效的实体或映射的超类

    我有三个实体 特征值 php
  • 如何处理致命错误:cURL错误7:无法连接到xxxx端口443

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

    我想从 Linux Linux 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 客户端到 Windows 2012 服务器建立安全的 ldap 连接 ldaps 以更改活动中的用户密
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • 致命错误 - 未找到“Mongo”类

    我正在尝试执行此操作 但我收到以下错误 致命错误 在 C wamp www 中找不到类 Mongo Info PHP 5 38 MongoDB mongodb win32 i386 2 0 2 MongoDB PHP 驱动程序 mongo
  • WordPress 子主题包括包含文件

    我在一家WordPress使用 AMPPS 作为本地主机在我的本地计算机上进行设置 使用 Delta 主题 我创建了一个子主题 delta2 child 初始设置效果很好 但是 我需要更改包含文件夹中名为 home slider php 的
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中

随机推荐

  • 有没有办法检查脚本是否在 dart vm 或 dart2js 中运行?

    有没有办法检查脚本是否在 dart vm 或 dart2js 中运行 也许使用镜像API 没有official据我所知 其目的是 出于所有实际目的 您不必知道您是在本机运行还是编译为 JavaScript 也就是说 您可以使用的技巧很少 最
  • 如何从 PHP 字符串中提取标题标签?

    如何从包含大量 HTML 的字符串中提取所有文本 h1 h2 etc标签到一个新变量 我想捕获这些元素中的所有文本并将它们作为逗号分隔值存储在新变量中 是否可以使用preg match all 首先 您需要使用 tidy 清理 HTML 示
  • gitlab 没有遥控器/原点/HEAD

    我对 git 还很陌生 但我一直在我设置的远程服务器上使用它 并且我很确定我了解基础知识 我刚刚设置了 gitlab 并将我的一些代码推送到了它的一个新项目中 我所做的是 获取目录中的所有代码 git init git 添加 git com
  • 如何使用SignalR向特定用户发送数据?

    我有一个通过 SignalR 接收消息的客户端 它工作得很好 但更像是广播 我希望能够向特定客户发送消息 在客户端 我有一个 userId 并且像这样设置连接 const userId getUserId if userId const b
  • 什么是自然语言处理中的分块器?

    有谁知道文本处理上下文中的分块器是什么以及它的用途是什么 根据这些幻灯片 分块是解析的一种替代方法 它提供了句子的部分句法结构 具有有限的树深度 而不是完整的解析 它比完整解析受到更多限制 但在提取或忽略信息时就足够了 因此被多次使用 因为
  • 通过车把部分传递变量

    我目前正在express js 应用程序中处理handlebars js 为了保持模块化 我将所有模板拆分为部分模板 我的问题 我找不到通过部分调用传递变量的方法 假设我有一个看起来像这样的部分 div h1 Headline h1 p L
  • 为什么 SwitchPreference 在从打开切换到关闭时不显示动画,反之亦然?

    我做了一个SwitchPreference对于我的应用程序preferences 问题是SwitchPreference当我在打开和关闭之间切换时 它没有显示动画 而是突然猛烈地切换 Here s preferences xml文件的代码
  • 有关 Android 的 Movie 类的信息

    我正在尝试展示一个 gif 动画 顺便说一句 我正在与班级一起做Movie 但 Android 开发者页面不授予有关这些方法的信息 如何调整 gif 的大小以适应布局 提前致谢 我一直在尝试使用做同样的事情 显示动画 GIF this me
  • NumPy有相当于Matlab缓冲区的功能吗?

    我看到有一个array split and split methods但是 当您必须分割长度不是块大小整数倍的数组时 这些并不是很方便 此外 这些方法的输入是切片数量而不是切片大小 我需要一些更像 Matlab 的东西buffer更适合信号
  • mysql中的数组变量

    MySQL 脚本中有没有办法声明一个数组 或任何集合 并循环它来执行操作 例如 SET myArrayOfValue 2 5 2 23 6 for each value in myArrayOfValue INSERT INTO EXEMP
  • 如何在谷歌地图v2的默认标记中绘制文本

    我想在 Google 地图 v2 的默认标记中绘制文本 我通过从可绘制图像中获取自己的图像来完成此操作 但如何在默认标记中更改它 我的代码是 marker icon BitmapDescriptorFactory fromBitmap dr
  • Excel 过滤功能 - 选择某些列作为输出

    我想对多个列应用过滤器函数 范围从A G并且只有列B D在输出中 我该怎么做 例如 FILTER A 1 G 7 K 1 K 7 K 1 结果是匹配条件的行的溢出数组 但输出仍然有 7 列 A G 我可以选择只输出Column吗B D TL
  • ImageMagick.NET 异常

    我得到了FileNotFoundException当尝试使用 ImageMagick NET 时 取自源代码中的 bin 文件夹 http imagemagick codeplex com releases view 30302 我得到的确
  • chrome.storage 设置\获取说明

    我想在我的扩展中保存信息 我用Chrome storage sync这样做 但是当我保存后立即阅读时 我无法正确检索该值 大概是做了什么蠢事吧 我尝试清除本地存储chrome storage sync clear但这没有帮助 我的保存功能是
  • 使用 .htaccess 密码保护单个文件

    我尝试使用 htaccess 对单个文件进行密码保护 但是 当访问该文件时 浏览器只会重定向到网站的主页 我的 webroot 上有 htpasswd 我的 htaccess 文件如下
  • 在 SQL Server 2005 中,如何设置整数列以确保值大于 0?

    这可能是一个简单的答案 但我找不到它 我有一个包含整数列的表 我想确保插入行时该列中的值大于零 我可以在代码方面执行此操作 但认为最好在桌面上强制执行它 Thanks 我上次的评论是错误的 现在一切都很好 您可以在列上使用检查约束 IIRC
  • 隐藏 ag-grid 中的列名称?

    是否可以隐藏 ag grid 中的第一行 列定义 我只想显示表中的数据并排除列标题 你可以加headerHeight组件上的属性并将其设置为 0 这将隐藏标头 就像这样
  • R:shapefile 上的梯度图

    我目前有一个英国的形状文件 并绘制了英国不同地区的物种数量 到目前为止 我刚刚绘制了 3 个物种种群水平 并将它们着色为红色 高 橙色 中 绿色 低 但我想做的是绘制一个渐变图 而不是仅受 3 种颜色的限制 到目前为止 我有一个名为 计数
  • VS2010 中的 Magick++ - 无法解析的外部符号

    我正在尝试在 VS2010 中使用 ImageMagick Magick 进行 C 项目 我从这里安装了库 klick 然后在我的项目中 我将 c program files ImageMagick 6 6 6 Q16 include 添加
  • 为什么 PHP 认为 0 等于字符串?

    我有以下代码 item price 0 Code to get item information goes in here if item price e item price 1 其目的是将商品价格初始化为 0 然后获取有关它的信息 如果