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()' 和 '布林值: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,我希望可以選擇使用具有 NULL 語義的 SQL...)。
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(
/* Testing equality */
'eq' => '==',
'ne' => '!=',
'gt' => '>',
'lt' => '<',
'ne2' => '<>',
'lte' => '<=',
'gte' => '>=',
/* Testing identity */
'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'));
/* Do comparisons */
$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