PHP 类型比较表

以下表格演示了 PHP 类型比较运算符 的行为,包括松散比较和严格比较。此补充内容也与手册中关于 类型转换 的部分相关。灵感来自各种用户评论以及 » BlueShoes 的工作。

在使用这些表格之前,了解类型及其含义很重要。例如,"42" 是一个 字符串,而 42 是一个 整数false 是一个 布尔值,而 "false" 是一个 字符串.

注意:

HTML 表单不传递整数、浮点数或布尔值;它们传递字符串。要确定字符串是否为数字,可以使用 is_numeric().

注意:

$x 未定义时,简单地执行 if ($x) 会生成级别为 E_NOTICE 的错误。相反,请考虑使用 empty()isset() 以及/或者初始化您的变量。

注意:

某些数字运算可能导致由常量 NAN 表示的值。任何对该值的松散或严格比较,包括它本身,但除了 true,都将导致 false 的结果。(即 NAN != NANNAN !== NAN)产生 NAN 的运算示例包括 sqrt(-1)asin(2)acosh(0)

使用 PHP 函数比较 $x
表达式 gettype() empty() is_null() isset() 布尔值 : if($x)
$x = ""; 字符串 true false true false
$x = null; NULL true true false false
var $x; NULL true true false false
$x 未定义 NULL true true false false
$x = []; 数组 true false true false
$x = ['a', 'b']; 数组 false false true true
$x = false; 布尔值 true false true false
$x = true; 布尔值 false false true true
$x = 1; 整数 false false true true
$x = 42; 整数 false false true true
$x = 0; 整数 true false true false
$x = -1; 整数 false false true true
$x = "1"; 字符串 false false true true
$x = "0"; 字符串 true false true false
$x = "-1"; 字符串 false false true true
$x = "php"; 字符串 false false true true
$x = "true"; 字符串 false false true true
$x = "false"; 字符串 false false true true

使用 == 进行松散比较
true false 1 0 -1 "1" "0" "-1" null [] "php" ""
true true false true false true true false true false false true false
false false true false true false false true false true true false true
1 true false true false false true false false false false false false
0 false true false true false false true false true false false* false*
-1 true false false false true false false true false false false false
"1" true false true false false true false false false false false false
"0" false true false true false false true false false false false false
"-1" true false false false true false false true false false false false
null false true false true false false false false true true false true
[] false true false false false false false false true true false false
"php" true false false false* false false false false false false true false
"" false true false false* false false false false true false false true
* 在 PHP 8.0.0 之前为 true

使用 === 进行严格比较
true false 1 0 -1 "1" "0" "-1" null [] "php" ""
true true false false false false false false false false false false false
false false true false false false false false false false false false false
1 false false true false false false false false false false false false
0 false false false true false false false false false false false false
-1 false false false false true false false false false false false false
"1" false false false false false true false false false false false false
"0" false false false false false false true false false false false false
"-1" false false false false false false false true false false false false
null false false false false false false false false true false false false
[] false false false false false false false false false true false false
"php" false false false false false false false false false false true false
"" false false false false false false false false false false false true

添加笔记

用户贡献的笔记 8 笔记

php at benizi dot com
14 年前
有趣的是,'empty()' 和 'boolean : if($x)'
被配对为逻辑反义词,就像 'is_null()' 和 'isset()' 一样。
Jan
18 年前
请注意,php 比较不具有传递性

"php" == 0 => true
0 == null => true
null == "php" => false
frank
17 年前
对于 <=,<,=>,> 的比较表会很好...
以下是 TRUE(在 PHP4&5 中测试过)
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
这对我是个惊喜(它不像 SQL,我想拥有具有 SQL 语义的 NULL 选项...)。
Jeroen
1 年前
请注意检查数组项的 *值* 与检查数组项的 *存在* 之间的区别
<?php
$arr
= [
'x' => 0,
'y' => null,
];

isset(
$arr['x']); // true,与 isset(0) 相同
isset($arr['y']); // false,与 isset(null) 相同

array_key_exists('y', $arr); // true,尽管值为 null
array_key_exists('z', $arr); // false
edgar at goodforall dot eu
14 年前
一些用于以 tsv 格式写出您自己的比较表的函数。可以轻松修改以添加更多测试用例和/或二进制函数。它将使用所有函数测试所有可比较项之间的相互比较。

<?php
$funcs
= array(
/* 测试相等性 */
'eq' => '==',
'ne' => '!=',
'gt' => '>',
'lt' => '<',
'ne2' => '<>',
'lte' => '<=',
'gte' => '>=',
/* 测试身份 */
'id' => '===',
'nid' => '!=='
);
class
Test {
protected
$a;
public
$b;
public function
__construct($a,$b){
$this->a = $a;
$this->b = $b;
}
public function
getab(){
return
$this->a.",". $this->b;
}

}
$tst1 = new Test(1,2);
$tst2 = new Test(1,2);
$tst3 = new Test(2,2);
$tst4 = new Test(1,1);

$arr1 = array(1,2,3);
$arr2 = array(2,3,4);
$arr3 = array('a','b','c','d');
$arr4 = array('a','b','c');
$arr5 = array();

$comp1 = array(
'ints' => array(-1,0,1,2),
'floats' => array(-1.1,0.0,1.1,2.0),
'string' => array('str', 'str1', '', '1'),
'bools' => array(true, false),
'null' => array(null),
'objects' => array($tst1,$tst2,$tst3,$tst4),
'arrays' => array($arr1, $arr2, $arr3, $arr4, $arr5)
);
$fbody = array();

foreach(
$funcs as $name => $op){
$fbody[$name] = create_function('$a,$b', 'return $a ' . $op . ' $b;');
}

$table = array(array('function', 'comp1', 'comp2', 'f comp1 comp2', 'type'));
/* 进行比较 */
$comp2 = array();
foreach(
$comp1 as $type => $val){
$comp2[$type] = $val;
}

foreach(
$comp1 as $key1 => $val1){
foreach(
$comp2 as $key2 => $val2){
addTableEntry($key1, $key2, $val1, $val2);
}
}
$out = '';
foreach(
$table as $row){
$out .= sprintf("%-20s\t%-20s\t%-20s\t%-20s\t%-20s\n", $row[0], $row[1], $row[2], $row[3], $row[4]);
}

print
$out;
exit;

function
addTableEntry($n1, $n2, $comp1, $comp2){
global
$table, $fbody;
foreach(
$fbody as $fname => $func){
foreach(
$comp1 as $val1){
foreach(
$comp2 as $val2){
$val = $func($val1,$val2);
$table[] = array($fname, gettype($val1) . ' => ' . sprintval($val1), gettype($val2) .' => ' . sprintval($val2), gettype($val) . ' => ' . sprintval($val), gettype($val1) . "-" . gettype($val2) . '-' . $fname);
}
}
}
}

function
sprintval($val){
if(
is_object($val)){
return
'object-' . $val->getab();
}
if(
is_array($val)){
return
implode(',', $val);
}
if(
is_bool($val)){
if(
$val){
return
'true';
}
return
'false';
}
return
strval($val);
}

?>
blue dot hirano at gmail dot com
9 年前
真值表应该用颜色区分;它们现在很难阅读(只是一大堆 TRUE 和 FALSE)。

另外,可以考虑:将比较结果相似的值进行聚类(如在 qntm.org/equality 上所做的那样)也会使表格更易读。(这可以通过手动重新排列标题顺序,将相关值放在一起,以简单地完成。)
jerryschwartz at comfortable dot com
19 年前
在某些语言中,布尔值在与整数一起使用时会被提升为整数(通常值为 1 或 -1)。我发现 PHP 两种方式都有。

如果你将值为 true 的布尔值加到值为 3 的整数,结果将为 4(因为布尔值被转换为整数)。

另一方面,如果你测试值为 true 的布尔值是否与值为 3 的整数相等,结果将为 true(因为整数被转换为布尔值)。

令人惊讶的是,乍一看,如果你使用 < 或 > 作为比较运算符,结果总是 false(同样是因为整数被转换为布尔值,而 true 既不小于也不大于 true)。
mark at theanti dot social
6 年前
0.0 与 0 不相同。

$x = 0.0;
gettype($x); // double
empty($x); // true
is_null($x); //false
isset($x); // true
is_numeric($x); // true
$x ? true : false; // false
$x == 0; // true
$x == "0"; // true
$x == "0.0"; // true
$x == false; // true
$x == null; // true
$x === 0; // false
$x === false; // false
$x === null; // false
$x === "0"; // false
$x === "0.0"; // false
To Top