string 'w32' == 0 在 php 中计算为 true。嗯?
Posted
技术标签:
【中文标题】string \'w32\' == 0 在 php 中计算为 true。嗯?【英文标题】:string 'w32' == 0 evaluates to true in php. huh?string 'w32' == 0 在 php 中计算为 true。嗯? 【发布时间】:2013-10-04 08:03:55 【问题描述】:所以我在创建 google 产品提要时在我的 php 中收到了通知。 通知是 "今天 _ 网站上出现了 4989 次以下 php 通知: PHP 注意:未定义索引:/xxx/Status.php 第 583 行中的 0"
这是该类中的代码
public function inStockLocally($productcode)
if($this->_status[$productcode]['status'] == self::IN_STOCK)
return $this->_status[$productcode]['in_stock_local'];
return false;
函数得到 $productcode = 0,但 productcode 实际上是 'w32',所以密钥不存在。
在调用函数的堆栈上,我把它放进去,以便打破麻烦的产品。
if ($productcode == 0)
$test = 'breakhere';
使用netbeans和firebug,$productcode = 'w32'时就断线了
所以我的问题是为什么 'w32' == 0 评估为真? 它还与其他类似的结构代码(例如“h94”)一起评估为真。
任何帮助都将不胜感激,因为部门中的任何人都无法弄清楚为什么会发生这种情况。
我想我没有在 q 中输入足够的信息。发生了两件事。 1. 'w32' 由于某种原因转换为数字 = 0。 2. 当产品代码的结构为'x##'时,[0] 作为我的键插入到数组中;
【问题讨论】:
相关:***.com/questions/15813490/… 【参考方案1】:我在这里有点新,所以如果这不是您期望的答案,请原谅,但是 PHP 做了很多自动类型转换。因此,任何不以数字字符(0..9、+、-等)开头的字符串都将计算为零。
【讨论】:
好的,谢谢,有道理,但为什么要注入 0 作为 $this->_status[0]['status'] 的键 在这种情况下没有比较。请注意,我的 php 通知说索引 0 未定义,而应该说索引 'w32' 未定义。 (实际上是定义的,但这只是为了争论。) 规则不能总是成立,因为产品代码 'cat2011' 从不 = 0。【参考方案2】:“如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式进行比较。”
http://php.net/manual/en/language.operators.comparison.php
另外,我想你有一个索引数组,虽然你希望它是一个关联数组:
array() 函数用于创建数组。
在PHP中,数组分为三种:
索引数组 - 具有数字索引的数组 关联数组 - 具有命名键的数组 多维数组 - 包含一个或多个数组的数组 句法 索引数组的语法:
数组(值1、值2、值3等);
关联数组的语法:
数组(key=>value,key=>value,key=>value,etc.);
【讨论】:
Please, don't link to or use w3schools. It's a horrible reference full of incorrect information that sometimes even leads to security holes. 例如,他们不知道鲍比桌...... 好的,感谢您的提示。我没有意识到这一点。但是,我发现在这种情况下,它们以简洁的方式解释了数组类型之间的区别,这是我在其他任何地方都找不到的。例如,手册页 php.net/manual/en/language.types.array.php 未能以任何有用的方式定义这种差异。 问题是他们确实有一些可能不错的页面。但是一个 PHP 初学者去那里最终会在http://www.w3schools.com/php/php_mysql_insert.asp
上结束 - 并编写带有巨大 sql 注入孔的代码
好的,我把链接去掉了,把相关的文字复制到这里。不过,我认为这是对原始问题的正确答案。以上是关于string 'w32' == 0 在 php 中计算为 true。嗯?的主要内容,如果未能解决你的问题,请参考以下文章