PHP: Как работают операторы "Не равен" и "Не идентичен", и они быстрее, чем операторы "Равный" или "Идентичный"?

Я спрашиваю о сравнении, скажем, у меня есть 2 небольших текста:

  • abc: "Это очень длинный текст"
  • xyz: "Это очень длинный текст"

Сравнивает ли PHP каждый символ или сравнивает их как двоичные с масками?

Как пример abc !== xyz, если PHP сравнивает их по символам, то неравенство будет быстрее, потому что оно ломается после первого символа?

Я уже читал такие вопросы, как: Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?

Итак, я знаю, что === быстрее чем == из-за кастинга.

Но что с === или же == по сравнению с !== или же !=?

1 ответ

Решение

Строки определяются как структура здесь:

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

Здесь определен оператор равенства. (Следующие три оператора равенства также работают по существу одинаково, за исключением того, что они пропускают проверку адреса, поскольку она всегда будет ложной)

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:

Сначала сравнивается адрес каждой строковой структуры. Если они равны, то строки должны быть равны. В противном случае проводятся дальнейшие проверки.

Во-вторых, если адреса не равны, то сравнивается длина каждой строки. Это просто проверка на целочисленное равенство, так как длина является частью определения структуры строки. Если длины не равны, возвращается false.

Затем содержимое памяти проверяется для каждой строки с помощью memcmp. Так как memcmp возвращает 0, если содержимое памяти одинаково, это возвращает значение true.

Чтобы явно ответить на ваш вопрос: PHP избегает проверки каждого символа строки, единственный случай, когда каждый символ будет проверяться, это то, что если все символы строки, кроме последнего символа, равны, и что длины строк являются так же.

Я должен сказать: если вы действительно беспокоитесь о === быть медленнее, чем !== тогда ты действительно не должен быть.

Другие вопросы по тегам