условная идентичность "===", производительность и конверсия - PullRequest
9 голосов
/ 02 мая 2011

Я всегда отказывался от ответов на вопросы stackoverflow, и при любом чтении, которое я делал, "===" превосходит "==", потому что использует более строгое сравнение, и вы не тратите ресурсы на преобразование типов значений для проверки матч.

Я могу прийти к этому с неправильным предположением, поэтому я предполагаю, что часть этого вопроса: «верно ли мое предположение?»

Во-вторых,

Я конкретно имею дело с ситуацией, когда я получаю данные из базы данных в виде строки "100".

Код, который я сравниваю, такой ...

    if ($this->the_user->group == 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

против

    if ( (int) $this->the_user->group === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

или даже

    if (intval($this->the_user->group) === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

достигается ли какая-либо целостность (или производительность) путем ручного приведения или преобразования просто для того, чтобы вы могли использовать сравнение идентификаторов ('===')?

Ответы [ 5 ]

13 голосов
/ 02 мая 2011

В вашем конкретном случае == - лучший вариант. Как вы (как видно из вашего кода), вероятно, уже выяснили, многие функции базы данных всегда будут возвращать строки, даже если вы получите целое число. Так что строгое сравнение типов действительно только увеличивает ваш код.

Кроме того, вы добавляете потенциальную (назовем это теоретическую) угрозу безопасности. Например. (int) '100AB2' даст 100. В вашем случае это, вероятно, не может произойти, но в других это может произойти.

Итак: не злоупотребляйте строгим сравнением, это не всегда хорошо. В основном это нужно только в неоднозначных случаях, например, возвращаемое значение strpos.

4 голосов
/ 22 мая 2011

Существует разница в производительности между == и === - последняя будет даже в два раза быстрее, см. Равен по сравнению с идентичным оператором сравнения .Разница, однако, слишком мала, чтобы ее беспокоить - если только код не выполняется миллионы раз.

3 голосов
/ 29 января 2014

В PHP есть несколько свободных сравнений WTF, которые возвращают TRUE, например:

array() == NULL

0 == 'Non-numeric string'

Всегда используйте строгое сравнение между переменной и строкой

$var === 'string'
3 голосов
/ 02 мая 2011

Любой прирост производительности будет микроскопически небольшим, если вы не выполняете буквально миллиарды и триллионы этих сравнений в течение нескольких дней / месяцев / лет подряд. Строгое сравнение имеет свое применение, но в PHP оно также несколько аномально. PHP является слабо типизированным языком и (обычно) делает правильные вещи для автоматического преобразования / приведения значений, чтобы быть правильным. В большинстве случаев нет необходимости проводить строгое сравнение, поскольку PHP будет делать правильные вещи.

Но есть случаи, например, при использовании strpos, когда автоматическое преобразование завершится неудачей. strpos вернет '0', если искомая игла находится в самом начале стога сена, что будет рассматриваться как ЛОЖЬ, что неправильно. Единственный способ справиться с этим - строгое сравнение.

3 голосов
/ 02 мая 2011

Это действительно крошечная оптимизация, которую вы там делаете.Лично я не думаю, что это действительно того стоит.

Любое усиление, которое вы получаете от не применения значения при использовании ===, теряется при явном приведении значения.В вашем случае, так как тип не важен для вас, вы должны просто сделать == и покончить с ним.

Я бы рекомендовал оставить ===, когда вам нужно также проверить тип- например, 0 оценивается как ложное и так далее.

...