Быстрый вопрос. Есть ли разница между
$success = true;
а также
$success = 'true';
Я знаю, что они не ' ==
' друг к другу, но есть ли разница в их использовании?
EDIT: Я обнаружил, что использование '===' вместо '==', когда вы видите, что $ success ошибочно решает мою проблему. Мой вопрос теперь в том, что, если я просто использую строки в случае, как показано ниже, и придерживаюсь '=='?
$User->ProcessLogin(); $loginsuccess = $User->ProcessLogin(); if ($loginsuccess == true) { echo "<big>Success<big><br />"; echo "<p>We are now redirecting you to the member area.</p>"; echo "<meta http-equiv='refresh' content='=2;MyAccountNEW.php' />"; } elseif ($loginsuccess == false) { echo "<span class='sorry'><b>Sorry, your account could not be found.</span></b><div id='shopperlogin'> <img class='shopperlogintext' src='images/shopperlogin.png'> <br /> <form method='post' action='loginNEW.php' name='loginform' id='loginform'> <fieldset> <label for='username'>Username:</label><input type='text' name='username' id='username' /><br /> <label for='password'>Password:</label><input type='password' name='password' id='password' /><br /> <input type='submit' name='login' id='login' value='Login' /> </fieldset> </form></div>"; }
Вот часть класса ..
function ProcessLogin() { if (!empty($_POST['username']) && !empty($_POST['password'])) { $username = mysql_real_escape_string($_POST['username']); $password = md5(mysql_real_escape_string($_POST['password'])); $checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."'"); if(mysql_num_rows($checklogin) == 1) { $row = mysql_fetch_array($checklogin); $email = $row['EmailAddress']; $_SESSION['Username'] = $username; $_SESSION['EmailAddress'] = $email; $_SESSION['LoggedIn'] = 1; $this->loggedin = true; $success = true; } else { $success = false; } return $success; } }
Любая непустая строка вычисляет значение true, а пустая строка – false. Следующий сценарий может пролить свет на вас:
<?php if('true' == true) { echo "'true' == true"; } else { echo "'true' != true"; } echo '<br />'; if('false' == true) { echo "'false' == true"; } else { echo "'false' != true"; } echo '<br />'; if('foo' == true) { echo "'foo' == true"; } else { echo "'foo' != true"; } echo '<br />'; if('false' == false) { echo "'false' == false"; } else { echo "'false' != false"; } echo '<br />'; if('' == true) { echo "'' == true"; } else { echo "'' != true"; } echo '<br />'; if('' == false) { echo "'' == false"; } else { echo "'' != false"; } ?>
Вот результат:
'true' == true 'false' == true 'foo' == true 'false' != false '' != true '' == false
В соответствии с запросом, вот еще несколько примеров сравнения == с === для различных значений.
<?php echo "<b>'true' vs. true</b><br />"; if('true' == true) { echo "'true' == true<br />"; } else { echo "'true' != true<br />"; } if('true' === true) { echo "'true' === true<br />"; } else { echo "'true' !== true<br />"; } echo "<br /><b>'false' vs. true</b><br />"; if('false' == true) { echo "'false' == true<br />"; } else { echo "'false' != true<br />"; } if('false' === true) { echo "'false' === true<br />"; } else { echo "'false' !== true<br />"; } echo "<br /><b>1 vs. true</b><br />"; if(1 == true) { echo "1 == true<br />"; } else { echo "1 != true<br />"; } if(1 === true) { echo "1 === true<br />"; } else { echo "1 !== true<br />"; } echo "<br /><b>0 vs. false</b><br />"; if(0 == false) { echo "0 == false<br />"; } else { echo "0 != false<br />"; } if(0 === false) { echo "0 === false<br />"; } else { echo "0 !== false<br />"; } echo "<br /><b>1 vs. 'true'</b><br />"; if(1 == 'true') { echo "1 == 'true'<br />"; } else { echo "1 != 'true'<br />"; } if(1 === 'true') { echo "1 === 'true'<br />"; } else { echo "1 !== 'true'<br />"; } echo "<br /><b>empty string '' vs. false</b><br />"; if('' == false) { echo "'' == false<br />"; } else { echo "'' != false<br />"; } if('' === true) { echo "'' === false<br />"; } else { echo "'' !== false<br />"; } ?>
Вывод:
'true' vs. true
'true' == true 'true' !== true
'false' vs. true
'false' == true 'false' !== true
1 против истинного
1 == true 1 !== true
0 против ложных
0 == false 0 !== false
1 против "истины"
1 != 'true' 1 !== 'true'
пустая строка '' vs. false
'' == false '' !== false
Сначала это логическое значение. 2-я строка
Вы можете видеть их разницу с этим.
$success = 'true'; $success2 = true; var_dump($success); var_dump($success2);
А также проверить результат из этого
var_dump($success == $success2); var_dump($success === $success2);
Вы также должны изучить таблицу сравнения этого типа. Реальная аккуратная информация и помогает понять PHP немного больше.
Я всегда стараюсь использовать более ограничительные ===
или !==
когда мне абсолютно нужен логический ответ, поэтому:
$success = 'true'; if( $success === 'false'){ ... }
На всякий случай.
true является логическим, «true» является строкой.
Да, есть разница. Каждое значение в переменной PHP (или почти любом языке программирования) имеет «тип». При создании / присвоении значения кавычками,
$foo = 'true';
вы создаете значение, тип которого является строкой, а при создании / присваивании значения без кавычек вы создаете переменную, тип которой является логическим
$bar = true;
Как и другие современные, динамические языки, PHP действительно пытается уладить вещи таким образом, что вам не нужно беспокоиться о таких вещах, как тип. Например, многие языки НЕ позволяют сравнивать равенство двух переменных, если они не одного типа, поэтому что-то вроде
if('true' == True) ...
недействительный код в python (вы получите исключение). С другой стороны, PHP пытается быть приятным и (за кулисами) говорит: «Хорошо, если вы используете какую-либо строку в операции равенства, мы будем притворяться, что строка имеет тип boolean и true, если только она не является нулевой строка». Вот почему, 90% времени, вы можете уйти с этим.
Однако есть различия. Чтобы начать с педантичного, компьютер, на котором работает PHP, должен выделить больше памяти для строки, чем для логического. В этот день и возраст это тривиальное количество, но отходы не хотят / не хотят.
Что еще более важно, иногда бывают случаи, когда принуждение типа PHP делает странные вещи, которые не имеют никакого смысла. Например, рассмотрим следующие
if ("false" == false) { echo "true\n"; } else { echo "false\n"; }
Этот оператор будет эхом «ложь», хотя интуитивно вы бы хотели, чтобы он возвращался к истине, поскольку «true» == true оценивается как истинный. Есть много таких крайних случаев, когда PHP будет действовать по-видимому странно. Таким образом, пытаясь сделать общий случай проще (давайте преобразуем переменные для людей), они сделали несколько менее распространенных случаев более сложными, что может привести к сложному отслеживанию ошибок. Вещи становятся действительно суровыми, когда некоторые люди в вашей команде понимают, что за кулисами принуждение, а другие нет.
Таким образом, по большому счету, всегда лучше возвращать явные булевы (без кавычек) из методов и функций, которые возвращают успех. Опытные программисты ожидают этого, и неопытные программисты будут сбиты с толку некоторыми ошибками, которые появляются, когда используются строки.