Важность использования = = = вместо == в php! [дубликат]

этот вопрос уже есть ответ здесь:

сегодня только я заметил и узнал о важности использования === оператора. Вы можете увидеть это в следующем пример:

$var=0;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=false;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=0;
if ($var===false) echo "true"; else echo "false";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 

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

9 ответов


конечно, только один пример: array_search()

предупреждение

эта функция может возвращать логическое значение FALSE, но может также возвращать не-булевое значение, которое оценивается как FALSE, например 0 или "". Пожалуйста, прочитайте раздел о переключатели для получения дополнительной информации. Используйте === оператора для проверки возвращаемого значения этой функции.

в основном, если вы используете любую функцию, возвращает значение успеха, но FALSE на отказ, вы должны проверить результат с === чтобы быть уверенным (иначе зачем было бы большое красное предупреждающее окно? ;))


примеры: next(), current()
или, Как также упоминалось, строковые функции как strpos(), stripos(), etc.

даже substr() хотя это не упоминается в явном виде:

возвращает извлеченную часть строки или FALSE при сбое.

но что если извлеченная часть"0"? Он также оценивает в FALSE, но это не ошибка.


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

рассмотрим следующий фрагмент кода

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}

любой сделал бы вывод из условия if, что утверждение $a == $c верно, потому что мы так привыкли к тому, что отношение равенства является транзитивным. Но это не годится для == счетчика пример:

$a = "0";
$b = 0;
$c = null;

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


на strpos() у вас есть 0, когда строка найдена, и false, когда отсутствует. Вы должны использовать === чтобы проверить разницу.


на === is строго сравнения типа оператор, это будет не только проверить значения, но и их тип, тогда как == только проверяет, является ли или нет значения такие же.

рассмотрим ситуацию, когда вы сравниваете число или строку:

if (4 === 4) // same type and value
{
  // true
}

но

if (4 == "4") // same value but different type
{
  // true
}

и

if (4 === "4") // same value but different type
{
  // false
}

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


хорошим примером, где вы можете попасть в беду, является сравнение 0 и строки, fx

if (0 == 'completed') {
  // evaluates as TRUE
}

строка, не начинающаяся с числа, становится 0 при преобразовании в int. Это может стать проблемой при сравнении состояния, которое может быть 0 к строке.


на === оператор проверяет тип, а также равенство значений.

вот почему 0 === false не возвращает true, так как они не одного типа.


strpos ($needle,$haystack) и связанные функции вернут false, если $needle не существует в $haystack, и 0, если $needle является первым символом $haystack; и есть целый ряд подобных функций. Использование == может дать вам неправильные результаты в этом случае, поэтому вы всегда должны использовать ===. Руководство clarly определяет, где это необходимо.


недавно я сам столкнулся с этой проблемой, когда писал быстрый синтаксический анализатор запросов SQL. Короче говоря,я сравнивал цитируемые параметры с их заполнителями в углу. В принципе, следующий код привел меня к некоторым трудным временам отладки (пример, конечно, упрощен)

$var = 0; // This is supplied dynamically

$someCondition = $var == '?';

$someCondition закончилось тем, что все время было правдой. дрожь

в основном любое нестрогое ( = = ) == сравнение вызовет строку приведение к целому числу. В зависимости от входных данных это может закончиться как 0 или int-значение строки, если оно есть, даже если вся строка не является полностью числовой.


Если вы сравниваете две числовые строки, они сравниваются как целые числа.1

var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE

и TRUE косвенно равно FALSE 2

$a = 0;
$b = 'x';
var_dump(FALSE == $a); // TRUE
var_dump($a == $b);  // TRUE
var_dump($b == TRUE);  // TRUE
var_dump(FALSE === $a); // FALSE
var_dump($a === $b);  // FALSE
var_dump($b === TRUE);  // FALSE