太空船运算符 <=> 的作用及返回值?
解读
这是 PHP7 引入的三向比较运算符(Spaceship Operator)。面试官问它,一方面考察你对 PHP7+ 新特性的敏感度,另一方面想确认你是否能在排序、链式比较、自定义对象比较等真实业务场景中写出更简洁、可维护的代码。国内一线互联网、电商、SaaS 公司普遍要求 PHP 版本 ≥7.4,<= > 已成为“必会”语法点;答不出来会直接被贴上“只会写 5.x 老代码”的标签。
知识点
- 语法形式:
(expr) <=> (expr) - 返回值:
- 左侧 < 右侧 → -1
- 左侧 == 右侧 → 0
- 左侧 > 右侧 → +1
注意:比较语义与 == 相同,先做类型转换再比;严格比较需自行封装。
- 支持类型:int、float、string、array、DateTime、DateTimeImmutable 以及实现了
__compare()或__invoke()的对象(PHP 8 起可用enum比较)。 - 典型场景:
usort/array_multisort的回调里一行写完升序/降序;- 链式写法:
return $a->score <=> $b->score ?: $a->age <=> $b->age; - 替代
version_compare:'1.2.3' <=> '1.10.0'返回 -1,可直接用于 Composer 版本号排序。
- 与
< 、>、==的区别:一次运算同时得到三种关系,避免多次 if/else,提高可读性和性能。 - 边界注意:
- NaN 与任何值比较都返回 +1;
- 数组递归比较时,元素个数相同且每个元素相等才返回 0;
- 对象未实现比较接口会抛警告并退化为属性哈希比较。
答案
太空船运算符 <=> 是 PHP7 提供的三向比较运算符,用于一次性判断两个表达式的大小关系。
返回值规则:
- 如果左操作数小于右操作数,返回整型
-1; - 如果两边相等,返回整型
0; - 如果左操作数大于右操作数,返回整型
1。
示例:
echo 1 <=> 2; // -1
echo 1.5 <=> 1.5; // 0
echo 'b' <=> 'a'; // 1
该运算符支持标量、数组、DateTime 及可比较对象,常用于 usort 回调、链式排序、版本号比较等场景,可显著减少冗余的分支判断。
拓展思考
- 性能对比:对 100 万元素做
usort,用<=>的单回调比传统if/else回调快 8–12%,OpCache 环境下差距更明显;面试可主动提及压测数据,体现“性能敏感”意识。 - 与严格比较结合:若业务要求类型安全,可先
is_same_type校验,再使用<=>,避免隐式类型转换带来的坑。 - 对象排序最佳实践:PHP8 起可在类中实现
__compare(),内部直接return $this->priority <=> $other->priority;,使usort($list, 'self::compare')语义清晰,方便单元测试。 - 面试反向提问:如果面试官追问“如何降序”,可回答
$b->score <=> $a->score或-($a <=> $b),展示对负号重用的理解;进一步讨论“稳定性”时,可补充第二关键字的<=>链,体现对排序稳定性的掌握。