Есть ли веская причина использовать оператор PHP === в операциях сравнения, а не ==?

Скажи, у меня есть этот код:

$str = '5';
$int = 5;

Для сравнения, есть ли причина использовать что-то вроде этого (с конвертацией):

if ($int === intval($str)) //...

или я просто использую нативные средства PHP?

if ($int == $str) //...

Мне, == выглядит проще, возможно, за счет того, что PHP сделает для меня дополнительную работу.

2

Решение

Использование ‘==’ приводит к незначительным ошибкам — например, если две строки выглядят как числа, PHP не сравнивает их как строки, что может дать неожиданные результаты — наиболее распространенный / страшный пример:

<?php

$actual_password = '240610708';
$provided_password = 'QNKCDZO';

// These would presumably be stored in your database
$stored_password_md5 = md5($actual_password); //0e462097431906509019562988736854;
$stored_password_hash = password_hash($actual_password, PASSWORD_DEFAULT);

$computed_password_md5 = md5($provided_password); //0e830400451993494058024219903391

var_dump($stored_password_md5 == $computed_password_md5); // bool(true) - BAD! NO!
var_dump($stored_password_md5 === $computed_password_md5); // bool(false) - Better, but still no. Vulnerable to timing attacks
var_dump(hash_equals($stored_password_md5, $computed_password_md5)); // bool(false) getting somewhere
var_dump(password_verify($provided_password, $stored_password_hash)); // bool(false) best

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

1

Другие решения

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

В вашем сценарии это нормально использовать == как это часто бывает при получении значений из БД или $_POST а также $_GET, они всегда будут строками.

Благодаря комментарию от Фреда Эммотта: будьте осторожны, следующее возвращение true:

var_dump('0xa' == '10');   // 0xa hex 10 in decimal
var_dump('10pigs' == 10);  // pigs truncated

Увидеть Преобразование строки в числа

1

Оператор == просто проверяет, равны ли левые и правые значения. Но оператор === (обратите внимание на лишние «=») фактически проверяет, равны ли левые и правые значения, а также проверяет, относятся ли они к одному и тому же типу переменной (например, являются ли они логическими значениями, целыми числами). , так далее.).

0
По вопросам рекламы [email protected]