有趣的是,'empty()' 和 'boolean : if($x)'
被配对为逻辑反义词,就像 'is_null()' 和 'isset()' 一样。
以下表格演示了 PHP 类型 和 比较运算符 的行为,包括松散比较和严格比较。此补充内容也与手册中关于 类型转换 的部分相关。灵感来自各种用户评论以及 » BlueShoes 的工作。
在使用这些表格之前,了解类型及其含义很重要。例如,"42"
是一个 字符串,而 42
是一个 整数。false
是一个 布尔值,而 "false"
是一个 字符串.
注意:
HTML 表单不传递整数、浮点数或布尔值;它们传递字符串。要确定字符串是否为数字,可以使用 is_numeric().
注意:
当 $x 未定义时,简单地执行
if ($x)
会生成级别为E_NOTICE
的错误。相反,请考虑使用 empty() 或 isset() 以及/或者初始化您的变量。
注意:
某些数字运算可能导致由常量
NAN
表示的值。任何对该值的松散或严格比较,包括它本身,但除了true
,都将导致false
的结果。(即NAN != NAN
和NAN !== NAN
)产生NAN
的运算示例包括sqrt(-1)
、asin(2)
和acosh(0)
。
表达式 | 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 |
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 |
有趣的是,'empty()' 和 'boolean : if($x)'
被配对为逻辑反义词,就像 'is_null()' 和 'isset()' 一样。
对于 <=,<,=>,> 的比较表会很好...
以下是 TRUE(在 PHP4&5 中测试过)
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
这对我是个惊喜(它不像 SQL,我想拥有具有 SQL 语义的 NULL 选项...)。
请注意检查数组项的 *值* 与检查数组项的 *存在* 之间的区别
<?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
一些用于以 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);
}
?>
真值表应该用颜色区分;它们现在很难阅读(只是一大堆 TRUE 和 FALSE)。
另外,可以考虑:将比较结果相似的值进行聚类(如在 qntm.org/equality 上所做的那样)也会使表格更易读。(这可以通过手动重新排列标题顺序,将相关值放在一起,以简单地完成。)
在某些语言中,布尔值在与整数一起使用时会被提升为整数(通常值为 1 或 -1)。我发现 PHP 两种方式都有。
如果你将值为 true 的布尔值加到值为 3 的整数,结果将为 4(因为布尔值被转换为整数)。
另一方面,如果你测试值为 true 的布尔值是否与值为 3 的整数相等,结果将为 true(因为整数被转换为布尔值)。
令人惊讶的是,乍一看,如果你使用 < 或 > 作为比较运算符,结果总是 false(同样是因为整数被转换为布尔值,而 true 既不小于也不大于 true)。
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