PHP真实& “真正的”差异

时间:2009-06-15 18:55:52

标签: php

快速提问。

之间有区别吗?
$success = true;

$success = 'true';

我知道他们彼此不是'==',但使用它们有区别吗?

编辑:我发现在查看$ success是否为false时使用'==='代替'=='解决了我的问题。我现在的问题是,如果我只是在下面这样的情况下使用字符串,并坚持使用'=='?

    $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;
            }
        }

5 个答案:

答案 0 :(得分:13)

任何非空字符串的计算结果为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'与true

'true' == true
'true' !== true

'false'与真实

'false' == true
'false' !== true

1 vs. true

1 == true
1 !== true

0 vs. false

0 == false
0 !== false

1 vs.'true'

1 != 'true'
1 !== 'true'

空字符串''与错误

'' == false
'' !== false

答案 1 :(得分:4)

首先是布尔值。第二个是字符串

你可以看到它们的不同之处。

$success = 'true';
$success2 = true;

var_dump($success);
var_dump($success2);

并查看此结果

var_dump($success == $success2);
var_dump($success === $success2);

您还应该学习this type comparison table.真实的信息,并帮助您更多地理解PHP。

答案 2 :(得分:1)

当我绝对需要布尔答案时,我总是尝试使用限制性更强的===!==,所以:

$success = 'true';
if( $success === 'false'){
...
}

以防万一。

答案 3 :(得分:0)

true是布尔值,'true'是字符串。

答案 4 :(得分:0)

是的,有区别。 PHP变量(或几乎任何编程语言)中的每个值都具有“类型”。使用引号创建/赋值时,

$foo = 'true';

您正在创建一个类型为字符串的值,并且在创建/赋值不带引号的值时,您将创建一个类型为boolean的变量

$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将以看似奇怪的方式行事。因此,在尝试使一般情况更简单(让我们为人们转换变量)时,他们使一些不太常见的情况更复杂,这可能导致难以追踪错误。当团队中的某些人了解幕后胁迫时,事情变得非常粗糙,而其他人则不然。

因此,总的来说,最好从返回成功的方法和函数返回显式布尔值(无引号)。经验丰富的程序员期望它和缺乏经验的程序员会对使用字符串时弹出的一些错误感到困惑。