Скажи, у меня есть этот код:
$str = '5';
$int = 5;
Для сравнения, есть ли причина использовать что-то вроде этого (с конвертацией):
if ($int === intval($str)) //...
или я просто использую нативные средства PHP?
if ($int == $str) //...
Мне, ==
выглядит проще, возможно, за счет того, что PHP сделает для меня дополнительную работу.
Использование ‘==’ приводит к незначительным ошибкам — например, если две строки выглядят как числа, 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
Хотя в вашем конкретном примере эта проблема не возникает, возможные проблемы приводят к тому, что многие люди рекомендуют / всегда / использовать ===, поэтому вам не нужно помнить, когда == безопасно, а когда нет ‘ т.
Зависит от того, что вы пытаетесь сделать. Некоторые функции могут возвращаться 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
Увидеть Преобразование строки в числа
Оператор == просто проверяет, равны ли левые и правые значения. Но оператор === (обратите внимание на лишние «=») фактически проверяет, равны ли левые и правые значения, а также проверяет, относятся ли они к одному и тому же типу переменной (например, являются ли они логическими значениями, целыми числами). , так далее.).