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。嗯?的主要内容,如果未能解决你的问题,请参考以下文章

centos6.5(32位)安装laravel5.0

PHP $string0 与 $string[0];

PHP(RegEx)电子邮件地址验证

PHP的正则表达式常用应用

php验证码

在 PHP 中向文件写入新行(换行)