2017-01-04 8 views
0

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

  • а: «Это очень длинный текст»
  • хуга: «xThis очень длинный текст»

Является ли PHP сопоставлением каждого персонажа или он сравнивает их как двоичные с масками?

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

я уже читал такие вопросы, как: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

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

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

+0

Что означает «сравнить их с двоичными с масками»? И '! ='/'! ==' делать то же самое, что '=='/'===' в этом отношении, как указано в ответе, на который вы ссылаетесь. – Carpetsmoker

+0

Возможно, я ошибаюсь, но из-за «масок» вы можете прочитать об этом здесь: https://en.wikipedia.org/wiki/Mask_(computing) – Regda

ответ

0

Строки определяются как структура 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.

+0

Это помогает мне много, но на самом деле не решает мой вопрос, потому что я еще не знаю, для какого оператора будет использоваться функция zend_string_equals. Итак, я думаю, что он будет использоваться для «===» и «! ==» - это всего лишь отрицание, а не отдельная функция, верно? – Regda

+0

Вот возможная реализация для memcmp: http://clc-wiki.net/wiki/memcmp – Regda

+0

@Regda Он будет использоваться для сравнения строк (если строка не является числовой, она будет использоваться с '==' и '===') - для сравнения разных типов вы должны ознакомиться с правилами сравнения [здесь] (http://php.net/manual/en/language.operators.comparison.php). – Gerrit0

 Смежные вопросы

  • Нет связанных вопросов^_^