值得注意的是 'empty()' 和 '布林值: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()' 和 '布林值:if($x)'
是成對的邏輯相反詞,就像 'is_null()' 和 'isset()' 一樣。
如果能提供 <=,<,=>,> 的比較表就好了...
以下是 TRUE(已測試 PHP4 和 5)
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
這讓我感到驚訝(它不像 SQL,我希望可以選擇使用具有 NULL 語義的 SQL...)。
請注意檢查陣列項目的*值*和檢查陣列項目*是否存在*之間的區別
<?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(
/* 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);
}
?>
真值表真的應該加上顏色;它們目前的樣子很難閱讀(只是一大堆 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