PHP Conference Japan 2024

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)

$x 与 PHP 函数进行比较
表达式 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
10年前
真值表确实应该着色;以目前的形式(只是一大堆 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