关于php:<>和!=之间的区别是什么?

What is the difference between <> and !=

本问题已经有最佳答案,请猛点这里访问。

在php中,要检查不相等(不检查类型),可以执行以下操作:

1
2
3
if( A != B ) {
    DO SOMETHING;
}

但您也可以这样做,其结果相同:

1
2
3
if( A <> B ) {
    DO SOMETHING;
}

有什么区别吗?

<>上使用!=是否以任何方式、形状或形式改变评估?


忘记文档一分钟,让我们看看源代码。让我们从扫描仪(lexer)开始:

1
2
3
<ST_IN_SCRIPTING>"!="|"<>" {
    return T_IS_NOT_EQUAL;
}

所以它们解析到相同的标记。让我们看看解析器:

1
expr T_IS_NOT_EQUAL expr { zend_do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }

所以我们知道触发的操作码是ZEND_IS_NOT_EQUAL

现在,让我们检查一下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
    USE_OPLINE

    zval *result = &EX_T(opline->result.var).tmp_var;

    SAVE_OPLINE();
    ZVAL_BOOL(result, fast_not_equal_function(result,
        opline->op1.zv,
        opline->op2.zv TSRMLS_CC));

    CHECK_EXCEPTION();
    ZEND_VM_NEXT_OPCODE();
}

所以没有什么区别。因为它们解析到相同的标记,所以它们具有完全相同的优先级(因此文档要么是错误的,要么是误导的)。因为它们使用相同的执行器,并且操作码例程中没有决策点,所以它们执行相同的代码。

所以是的,<>!=是100%可互换的,完全没有技术上的理由使用它们。

有了这句话,一致性就有了重要的收获。所以我建议你还是坚持使用!=,完成它……

编辑

我更新了文档以反映这一点,并修复了另一个具有优先顺序的问题(++和--与强制转换具有相同的优先顺序)。在docs.php.net上查看


没有区别。

但是,!=允许更容易地添加额外的=来强制类型比较。


人老了,人新了。

根据手册:

1
2
$a != $b    Not equal   TRUE if $a is not equal to $b after type juggling.
$a <> $b    Not equal   TRUE if $a is not equal to $b after type juggling.

使用!=

次要的区别:还有一个优先顺序。看这儿。

在优先表中,<>位于!=之前,但它们完成了完全相同的事情。


如文档网站所述,<>!=只是同义词。这意味着它们完全可以互换。PHP的历史有点疯狂,所以命名约定,甚至到了调用操作符的程度,仍然没有真正统一。


没有区别。我猜<>是在以后的PHP版本中添加的内容。有点让我想起了Python。我认为对于和运算符使用和或


根据php手册:http://fr.php.net/manual/en/language.operators.comparison.php这似乎没有什么区别。


没什么不同,但我想我记得!=曾经更快,因为我运行了一个测试,发现<>正在执行我正在比较的对象的"diff"方法,这可能比"compare"方法慢。