2

这是绝对的疯狂。我今天正在测试一个应该始终评估为单个字符的 post 变量。示例代码是...

if($_POST['status'] == '' || $_POST['status'] == 0){ die('oh no!'); }

如果我传递 P 的状态,它正在执行 die 语句。然后,我使用以下代码创建了一个 PHP 文件...

echo 'P1: '.intval($_POST['status']=='').'<br />';
echo 'P2: '.intval($_POST['status']==0).'<br />';
echo 'P3: '.intval('P'==0).'<br />';

你猜怎么了?P2 和 P3 都评估为 TRUE。intval 只是为了在 P1 上显示 0 而不是什么都没有。

这是 PHP 的已知错误吗?这只是我正在运行的版本上的问题吗?坦率地说,我完全不知道它为什么这样做。它使用三等式正确评估,但不是双等式。在我的书中,P 绝对不等于 0...

4

3 回答 3

10

来自PHP 文档

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。

于 2013-01-23T18:40:35.250 回答
1

阅读比较的php手册。http://php.net/manual/en/language.operators.comparison.php

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。

如果您不想进行转换,则需要使用三等号。

$a === $b

如果 $a 等于 $b 并且它们属于同一类型,则为 TRUE

在哪里$a == $b

如果 $a 等于 $b 并且它们属于同一类型,则为 TRUE。

.

于 2013-01-23T18:41:45.097 回答
1

在使用 比较字符串和数字时==,PHP 将该字符串转换为数字。

该字符串'P'中没有任何数字字符。因此,PHP 将其评估为 number 0。终于0 == 0发生了,就是true

另一方面,如果您使用三等号 ( ===),则不会发生上述转换。PHP 期望它们的类型也匹配。因为其中一个是字符串,另一个是数字,所以它返回false.

于 2013-01-23T18:46:42.620 回答