PHP и правильный способ использования функции strcmp - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над следующим фрагментом. В чем смысл использования !== 0 внутри первого условия if, в то время как даже второе условие возвращает тот же результат без использования !== 0?

Я следил за некоторым онлайн-руководством и заметил, что большинство разработчиков используют !== 0, но я случайно заметил, что я также получаю тот же результат, по крайней мере, в этом конкретном примере c без использования !== 0

<?php 
  
$name1 = "Geeks"; 
$name2 = "geeks"; 
  

if (strcmp($name1, $name2) !== 0) { 
    echo 'Strings are not equal'; 
} 
else { 
    echo 'Strings are equal'; 
} 

if (strcmp($name1, $name2)) { 
    echo 'Strings are not equal'; 
} 
else { 
    echo 'Strings are equal'; 
} 
?> 

1 Ответ

1 голос
/ 27 мая 2020

Операторы сравнения «===» и «! ==» подтверждают две вещи:

  1. Значения равны, и
  2. Значения одного типа

Краткий ответ на ваш вопрос «в чем смысл использования! == с функцией strcmp» - это просто «это хорошая практика». Это единственная причина, по которой конкретно strcmp, и! = Даст вам точно такой же результат, когда дело доходит до этой функции.

Длинный ответ выглядит следующим образом:

PHP традиционно слабо типизированный язык. То есть типы данных не так уж и важны, и PHP автоматически приводит типы к типам. Он по-прежнему делает это по умолчанию (хотя за последние годы было добавлено много вещей для улучшения ситуации). Например, если вы добавите строку «1» к целому числу 1, PHP автоматически преобразует строку в целое число и вернет целочисленное значение 2. Строго типизированные языки вернут ошибку, если вы попытаетесь это сделать. Другой пример: PHP приведет к преобразованию 0 в логическое значение false и любое другое ненулевое значение в логическое значение true.

Это второй пример, который вызывает проблемы с некоторыми встроенными функциями PHP. Например, функция strpos (). Если вы проверите страницу документации для strpos , вы увидите большое «Предупреждение» в разделе «Возвращаемые значения», в котором говорится: «Эта функция может возвращать логическое значение FALSE, но также может возвращать не-логическое значение, которое оценивает в ЛОЖЬ ". По этой причине рекомендуется использовать оператор «===», чтобы убедиться, что вы получаете точное значение и тип, которые ожидаете. Таким образом, «=== 0» означает, что строка была найдена в начале ввода, а «=== false» означает, что строка не найдена. Если вы просто использовали «== false», вы не будете различать строку, найденную в начале ввода, и строку, которая не будет найдена вообще (потому что 0 будет неявно приведено к логическому false для оператора «if» ).

Итак, разработчики привыкли проверять равенство и тип, используя «===» и «! ==». Это хорошая привычка.

Поскольку strcmp всегда возвращает целое число, а вы всегда сравниваете его с целым числом, неявного преобразования типов не существует, поэтому сравнение типов и равенство не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...