Строки определяются как структура here:
typedef struct {
char *c;
size_t len;
size_t a;
} smart_string;
Оператор равенства определяется here. (Следующие три оператора равенства также выполнять по существу таким же образом, за исключением того, что они пропустить проверку адреса, как это всегда будет ложным)
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 избегает проверки каждого символа строки, единственным случаем, в котором будет проверяться каждый символ, является то, что если каждый символ строки, за исключением последнего символа, равен, и что длины строки одинаковы.
Я должен сказать: Если вы действительно беспокоитесь о ===
, то он будет медленнее, чем !==
, а затем вы really shouldn't be.
Что означает «сравнить их с двоичными с масками»? И '! ='/'! ==' делать то же самое, что '=='/'===' в этом отношении, как указано в ответе, на который вы ссылаетесь. – Carpetsmoker
Возможно, я ошибаюсь, но из-за «масок» вы можете прочитать об этом здесь: https://en.wikipedia.org/wiki/Mask_(computing) – Regda