PHP的宇宙飞船运营商< =>如何?处理无与伦比的操作数?

时间:2015-06-18 08:59:43

标签: php-7 spaceship-operator

将在PHP 7中添加太空船运营商。我不确定它在某些边缘情况下的工作原理。

$a <=> $b将返回:

  • 1 如果$ a&gt; $ B
  • 0 如果$ a == $ b
  • -1 如果$ a&lt; $ B

如果值不具有可比性,会发生什么?

可以比较哪些变量类型?

1 个答案:

答案 0 :(得分:10)

简单!在PHP的内部实现运算符defers to a function called compare_function的拉取请求,因此您只需阅读compare_function 200-line implementation宏观重C和你&#39 ;能够理解自己的行为。控制结构只有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如果$a < $b0 $a == $b1 if $a > $b

但如果<==>均未返回,则太空船会混淆并返回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)

无与伦比类型的结果显然是无益的,并且会使任何期望太空船运营商始终如一地订购不同类型的价值的东西混淆不清。因此,在可能会进行无意义的比较的情况下,请不要使用它。