新操作符

PHP 7 引入了两个感兴趣的运算符。这些运算符有助于编写更少、更简洁的代码,因此与传统的运算符相比,最终代码的可读性更高。让我们来看看它们。

太空船运算符 (<=>)

Spaceship 或组合比较运算符可用于比较值(字符串、整数、浮点数等)、数组和对象。该操作符只是一个包装,执行的任务与三个比较操作符 ==<> 相同。该操作符还可用于为 usortuasortuksort 的回调函数编写更简洁的代码。该运算符的工作原理如下

  • 如果左右两侧的操作数相等,则返回 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 方法相同。

<=> 运算符的一些示例可以在 https://wiki.php.net/rfc/combinedcomparison-operator 中找到。这是一份 RFC 出版物,其中包含有关其用法的更多有用详细信息。

该运算符在对数组进行排序时更有用。看一下下面的代码:

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';

正如前面的示例所示,合并运算符可以帮助编写干净、简洁且更少的代码。