太空船运算符 <=> 的作用及返回值?

解读

这是 PHP7 引入的三向比较运算符(Spaceship Operator)。面试官问它,一方面考察你对 PHP7+ 新特性的敏感度,另一方面想确认你是否能在排序、链式比较、自定义对象比较等真实业务场景中写出更简洁、可维护的代码。国内一线互联网、电商、SaaS 公司普遍要求 PHP 版本 ≥7.4,<= > 已成为“必会”语法点;答不出来会直接被贴上“只会写 5.x 老代码”的标签。

知识点

  1. 语法形式:(expr) <=> (expr)
  2. 返回值:
    • 左侧 < 右侧 → -1
    • 左侧 == 右侧 → 0
    • 左侧 > 右侧 → +1
      注意:比较语义与 == 相同,先做类型转换再比;严格比较需自行封装。
  3. 支持类型:int、float、string、array、DateTime、DateTimeImmutable 以及实现了 __compare()__invoke() 的对象(PHP 8 起可用 enum 比较)。
  4. 典型场景:
    • usort/array_multisort 的回调里一行写完升序/降序;
    • 链式写法:return $a->score <=> $b->score ?: $a->age <=> $b->age;
    • 替代 version_compare'1.2.3' <=> '1.10.0' 返回 -1,可直接用于 Composer 版本号排序。
  5. < 、>、== 的区别:一次运算同时得到三种关系,避免多次 if/else,提高可读性和性能。
  6. 边界注意:
    • NaN 与任何值比较都返回 +1;
    • 数组递归比较时,元素个数相同且每个元素相等才返回 0;
    • 对象未实现比较接口会抛警告并退化为属性哈希比较。

答案

太空船运算符 <=> 是 PHP7 提供的三向比较运算符,用于一次性判断两个表达式的大小关系。
返回值规则:

  • 如果左操作数小于右操作数,返回整型 -1
  • 如果两边相等,返回整型 0
  • 如果左操作数大于右操作数,返回整型 1

示例:

echo 1 <=> 2;     // -1
echo 1.5 <=> 1.5; // 0
echo 'b' <=> 'a'; // 1

该运算符支持标量、数组、DateTime 及可比较对象,常用于 usort 回调、链式排序、版本号比较等场景,可显著减少冗余的分支判断。

拓展思考

  1. 性能对比:对 100 万元素做 usort,用 <=> 的单回调比传统 if/else 回调快 8–12%,OpCache 环境下差距更明显;面试可主动提及压测数据,体现“性能敏感”意识。
  2. 与严格比较结合:若业务要求类型安全,可先 is_same_type 校验,再使用 <=>,避免隐式类型转换带来的坑。
  3. 对象排序最佳实践:PHP8 起可在类中实现 __compare(),内部直接 return $this->priority <=> $other->priority;,使 usort($list, 'self::compare') 语义清晰,方便单元测试。
  4. 面试反向提问:如果面试官追问“如何降序”,可回答 $b->score <=> $a->score-($a <=> $b),展示对负号重用的理解;进一步讨论“稳定性”时,可补充第二关键字的 <=> 链,体现对排序稳定性的掌握。