新操作符
PHP 7 引入了两个感兴趣的运算符。这些运算符有助于编写更少、更简洁的代码,因此与传统的运算符相比,最终代码的可读性更高。让我们来看看它们。
太空船运算符 (<=>
)
Spaceship 或组合比较运算符可用于比较值(字符串、整数、浮点数等)、数组和对象。该操作符只是一个包装,执行的任务与三个比较操作符 ==
、<
和 >
相同。该操作符还可用于为 usort
、uasort
和 uksort
的回调函数编写更简洁的代码。该运算符的工作原理如下
-
如果左右两侧的操作数相等,则返回 0
-
如果右操作数大于左操作数,则返回 -1
-
如果左操作数大于右操作数,则返回 1
让我们通过比较整数、字符串、对象和数组来看看几个例子,并注意其结果:
$int1 = 1;
$int2 = 2;
$int3 = 1;
echo $int1 <=> $int3; //Returns 0
echo '<br>';
echo $int1 <=> $int2; //Returns -1
echo '<br>';
echo $int2 <=> $int3; //Returns 1
运行前面的代码,您将得到类似于以下内容的输出:
0
-1
1
在第一次比较中,我们比较了 $int1
和 $int3
,两者相等,因此将返回 0
。在比较 $int1
和 $int2
的第二次比较中,由于右操作数($int2
)大于左操作数($int1
),因此将返回 -1
。最后,第三次比较将返回 1
,因为左操作数($int2
)大于右操作数($int3
)。
前面是一个比较整数的简单示例。我们可以用同样的方法检查字符串、对象和数组,它们的比较方法与标准的 PHP 方法相同。
|
该运算符在对数组进行排序时更有用。看一下下面的代码:
Function normal_sort($a, $b) : int
{
if( $a == $b )
return 0;
if( $a < $b )
return -1;
return 1;
}
function space_sort($a, $b) : int
{
return $a <=> $b;
}
$normalArray = [1,34,56,67,98,45];
//Sort the array in asc
usort($normalArray, 'normal_sort');
foreach($normalArray as $k => $v)
{
echo $k.' => '.$v.'<br>';
}
$spaceArray = [1,34,56,67,98,45];
//Sort it by spaceship operator
usort($spaceArray, 'space_sort');
foreach($spaceArray as $key => $value)
{
echo $key.' => '.$value.'<br>';
}
在前面的代码中,我们使用了两个函数对具有相同值的两个不同数组进行排序。数组 $normalArray
使用 normal_sort
函数排序,其中 normal_sort
函数使用 if
语句比较数值。第二个数组 $spaceArray
的值与 $normalArray
相同,但该数组是通过 space_sort
函数排序的,该函数使用 Spaceship
运算符。两个数组排序的最终结果相同,但回调函数中的代码不同。normal_sort
函数有 if
语句和多行代码,而 space_sort
函数只有一行代码,仅此而已!space_sort
函数代码更清晰,不需要多条 if
语句。
空合并运算符(??
)
我们都知道三元运算符,也经常使用它们。三元运算符只是 if-else
语句的单行替换。例如,请看下面的代码:
$post = ($_POST['title']) ? $_POST['title'] : NULL;
如果存在 $_POST['title']
,那么 $post
变量将被赋值;否则,将赋值为 NULL
。但是,如果 $_POST
或 $_POST['title']
不存在或为空,PHP 将发出未定义索引的通知。要解决这个问题,我们需要使用 isset
函数,如下所示:
$post = isset($_POST['title']) ? $_POST['title'] : NULL;
大多数情况下,这看起来没什么问题,但当我们需要检查多个地方的值时,就会变得非常麻烦,尤其是在使用 PHP 作为模板语言时。
在 PHP 7 中,引入了凝聚运算符,它很简单,如果第一个操作数(左操作数)存在且不为空,则返回其值。否则,返回第二个操作数(右操作数)。请看下面的示例:
$post = $_POST['title'] ?? NULL;
本例与前面的代码完全相似。coalesce 操作符检查 $_POST['title']
是否存在。如果存在,运算符将返回它;否则,返回 NULL
。
该操作符的另一大特点是可以进行链式操作。下面是一个例子:
$title = $_POST['title'] ?? $_GET['title'] ?? 'No POST or GET';
根据定义,它将首先检查第一个操作数是否存在并返回它;如果不存在,它将返回第二个操作数。现在,如果在第二个操作数上使用了另一个 coalesce 操作符,则将应用相同的规则,如果存在,将返回左操作数的值。否则,将返回右操作数的值。
因此,前面的代码与下面的代码相同:
If(isset($_POST['title']))
$title = $_POST['title'];
elseif(isset($_GET['title']))
$title = $_GET['title'];
else
$title = 'No POST or GET';
正如前面的示例所示,合并运算符可以帮助编写干净、简洁且更少的代码。