比较运算符
等于运算符 ==
返回两个值类型转换后是否相等。如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。
<?php
var_dump(0 == 'foo'); // bool(true)
var_dump(1 == '01'); // bool(true)
var_dump('10' == '1e1'); // bool(true)
以上规则同样也适用于 switch
语句。
<?php
$foo = 'foo';
switch ($foo) {
case 0:
var_dump(0);
break;
case 'foo':
var_dump('foo');
break;
}
// int(0)
全等运算符 ===
返回两个值的类型和数值是否相等。
<?php
var_dump(0 === '0'); // bool(false)
var_dump(100 === 1e2); // bool(false)
不等运算符 !=
返回两个值类型转换后是否不等。
<?php
var_dump(0b11 != '3'); // bool(false)
var_dump(0 != '001'); // bool(true)
var_dump('foo' != 'bar'); // bool(true)
不全等运算符 !==
返回两个值的类型或数值是否不等。
<?php
var_dump(0 !== '0'); // bool(true)
var_dump(100 !== 1e2); // bool(true)
小于运算符 <
返回一个值是否严格小于另一个值。
<?php
var_dump(3 < 3); // bool(false)
var_dump(3 < 10); // bool(true)
var_dump(3 < 'foo'); // bool(false)
var_dump(3 < '0010'); // bool(true)
大于运算符 >
返回一个值是否严格大于另一个值。
<?php
var_dump(3 > 3); // bool(false)
var_dump(10 > 3); // bool(true)
var_dump('foo' > 3); // bool(false)
var_dump('0010' > 3); // bool(true)
小于等于运算符 <=
返回一个值是否小于或等于另一个值。
<?php
var_dump(3 <= 3); // bool(true)
var_dump(3 <= 10); // bool(true)
var_dump(3 <= 'foo'); // bool(false)
var_dump(3 <= '0010'); // bool(true)
大于等于运算符 >=
返回一个值是否大于或等于另一个值。
<?php
var_dump(3 >= 3); // bool(true)
var_dump(10 >= 3); // bool(true)
var_dump('foo' >= 3); // bool(false)
var_dump('0010' >= 3); // bool(true)
太空船运算符(组合比较符) <=>
当一个值小于、等于、大于另一个值时分别返回一个小于、等于、大于 0 的整数。
<?php
var_dump(1 <=> 1); // int(0)
var_dump(2 <=> 1); // int(1)
var_dump(1 <=> 2); // int(-1)
var_dump('foo' <=> 'foo'); // int(0)
var_dump('foo' <=> 'bar'); // int(1)
var_dump('bar' <=> 'foo'); // int(-1)
var_dump([] <=> []); // int(0)
var_dump([2, 4, 5] <=> [2, 4, 5]); // int(0)
var_dump([2, 4, 5] <=> [2, 4, 4]); // int(1)
var_dump([2, 4, 4] <=> [2, 4, 5]); // int(-1)
var_dump(['foo' => 'cat'] <=> ['foo' => 'cat']); // int(0)
var_dump(['foo' => 'dog'] <=> ['foo' => 'cat']); // int(1)
var_dump(['foo' => 'cat'] <=> ['foo' => 'dog']); // int(-1)
var_dump(['foo' => 'cat', 'bar' => 'dog'] <=> ['foo' => 'cat']); // int(1)
var_dump(['foo' => 'cat'] <=> ['bar' => 'dog']); // int(1)
$foo = (object)['foo' => 'cat'];
$bar = (object)['foo' => 'cat'];
var_dump($foo <=> $bar); // int(0)
$foo = (object)['foo' => 'dog'];
$bar = (object)['foo' => 'cat'];
var_dump($foo <=> $bar); // int(1)
$foo = (object)['foo' => 'cat'];
$bar = (object)['foo' => 'dog'];
var_dump($foo <=> $bar); // int(-1)
$foo = (object)['foo' => 'cat'];
$bar = (object)['bar' => 'dog'];
var_dump($foo <=> $bar); // int(1)
另一个条件运算符是 ?:
(或三元运算符)。 表达式一 ? 表达式二 : 表达式三
在表达式一求值为 true
的时候值为表达式二,在表达式一求值为 false
的时候值为表达式三。建议避免将三元运算符堆积在一起使用。当在一条语句中使用多个三元运算符时会造成 PHP 运算结果不清晰。
<?php
$foo = 'foo';
$bar = isset($foo) ? $foo : 'bar';
var_dump($bar); // string(3) "foo"
可以省略三元运算符中间那部分。 表达式一 ?: 表达式二
在表达式一求值为 true
时返回表达式一,否则返回表达式二。
<?php
$foo = 'foo';
$bar = isset($foo) ?: 'bar';
var_dump($bar); // bool(true)
NULL
合并操作符 ??
返回从左往右第一个存在且不为 NULL
的操作数。如果都没有定义且不为 NULL
,则返回 NULL
。
<?php
$foo = $foo ?? 'foo';
var_dump($foo); // string(3) "foo"
$bar ??= 'bar';
var_dump($bar); // string(3) "bar"