PHP:不等于和不相同的运算符如何工作?它们比等于或相同的运算符更快吗?

PHP: How does the Not-equal and Not-identical Operators work and are they faster then the Equal or Identical Operators?

我问的是比较, 假设我有 2 个小文本:

PHP 是比较每个字符还是将它们作为带掩码的二进制进行比较?

例如 abc !== xyz,如果 PHP 按字符比较它们,那么不等于会更快,因为它在第一个字符后中断?

我已经阅读过以下问题: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

所以我知道 ===== 快,因为有 Casting。

但是 =====!==!= 相比有什么区别?

字符串被定义为结构here

typedef struct {
    char *c;
    size_t len;
    size_t a;
} smart_string;

等于运算符已定义 here。 (以下三个相等运算符也以基本相同的方式执行,除了它们跳过地址检查,因为它始终为 false)

static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2)
{
    return s1 == s2 || (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)));
}

万一你不会说C:

首先,比较每个字符串结构的地址,如果它们相等则字符串必须相等。否则,将进行进一步检查。

其次,如果地址不相等,则比较每个字符串的长度。这只是一个整数相等性检查,因为长度是字符串结构定义的一部分。如果长度不相等,则 returned.

为 false

接下来,用memcmp检查每个字符串的内存内容。由于 memcmp returns 0 如果内存内容相等,则取反为 return true。

要明确回答您的问题:PHP 避免检查字符串的每个字符,检查每个字符的唯一情况是如果字符串中除最后一个字符外的每个字符都相等,并且字符串的长度是相同的。

我必须说:如果你真的担心 ===!== 慢,那么你 really shouldn't be.