PHP的宇宙飞船运算符是如何处理不可比拟的操作数的? [英] How does PHP's spaceship operator <=> handle incomparable operands?
问题描述
将在PHP 7中添加宇宙飞船运算符。我不确定它在某些边缘情况下是如何工作的。
$a <=> $b
将返回:
- 1if$a>$b
- 0如果$a==$b
- -1如果$a<;$b
如果这些值不具有可比性,会发生什么情况?
可以比较哪些变量类型?
推荐答案
简单!在PHP内部实现运算符defers to a function called compare_function
的Pull请求,因此您只需阅读compare_function
的200-line implementation,您就能够自己理解其行为。控制结构只有4层深,只有几十个宏和其他函数被调用;应该很容易!
...
好吧,我承认,我也不够聪明,不能把所有这些都去掉。所以我们还是做些实验吧。
如果<
、==
和>
可以一致地处理操作数,那么<=>
也可以
由于type juggling,可以将PHP中的大多数类型与其他类型进行有意义的比较。在任何情况下,飞船操作员的行为将与<
、==
和>
一致。
例如,让我们尝试使用一个字符串和一个int:
php > var_dump(3 < 'bla');
bool(false)
php > var_dump(3 == 'bla');
bool(false)
php > var_dump(3 > 'bla');
bool(true)
php > var_dump(3 <=> 'bla');
int(1)
或null
和资源:
php > $fp = fopen('test', 'r');
php > var_dump(null > $fp);
bool(false)
php > var_dump(null == $fp);
bool(false)
php > var_dump(null < $fp);
bool(true)
php > var_dump(null <=> $fp);
int(-1)
或使用浮点和数组:
php > var_dump(1.0 > []);
bool(false)
php > var_dump(1.0 == []);
bool(false)
php > var_dump(1.0 < []);
bool(true)
php > var_dump(1.0 <=> []);
int(-1)
在所有这些情况下,$a <=> $b
的结果正如文档所说:-1
If$a < $b
、0
If$a == $b
和1
If$a > $b
。
但如果<
、==
和>
均未返回TRUE,则宇宙飞船会混淆并返回1
尽管类型强制允许大多数不同类型的值相互比较,从而使$a < $b
、$a == $b
和$a > $b
中恰好有一个为真,但在一些边缘情况下,这一点不成立。在这些情况下,$a <=> $b
的结果为1,这没有多大意义或用处。
例如,让我们比较一下不同类的一些对象:
php > class Foo {}
php > class Bar {}
php > $a = new Foo;
php > $b = new Bar;
php > var_dump($a < $b);
bool(false)
php > var_dump($a == $b);
bool(false)
php > var_dump($a > $b);
bool(false)
php > var_dump($a <=> $b);
int(1)
php > var_dump($b <=> $a);
int(1)
或一些严格不大于另一个的不相等数组:
php > $a = ['foo' => 'bar'];
php > $b = ['bar' => 'foo'];
php > var_dump($a < $b);
bool(false)
php > var_dump($a == $b);
bool(false)
php > var_dump($a > $b);
bool(false)
php > var_dump($a <=> $b);
int(1)
php > var_dump($b <=> $a);
int(1)
<=>
也可以抛出警告
如果我们将一个对象与一个int进行比较,我们会收到一条警告,就像我们对任何其他比较运算符所做的那样:
php > $a = new stdclass;
php > var_dump($a <=> 1);
PHP Notice: Object of class stdClass could not be converted to int in php shell code on line 1
int(0)
对于不可比较类型的结果显然是没有帮助的,并且会把期望宇宙飞船操作员一致地对不同类型的值排序的任何事情搞得一团糟。因此,不要在它可能会进行这样毫无意义的比较的情况下使用它。
这篇关于PHP的宇宙飞船运算符是如何处理不可比拟的操作数的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!