PHP中true和'true'的区别

6

快速问题。这两者之间有什么不同吗?

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

由于您只关心登录状态是否设置,而不关心它设置为什么,因此可以使代码更简单。变量$loginsuccess默认为空,除非返回某些内容。因此,在ProcessLogin()函数中,只需使用"return true;"而不是使用$success变量。然后测试:if ($loginsuccess) { // great, it worked } else { // fail }。最好使用原始表单,而不是在失败时输出相同的表单和重复的代码。这样,当需要更改某些内容时,您只需修复原始/单个表单即可。 - Alec
5个回答

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' vs. true

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

1 vs. true

1 == true
1 !== true

0与false的区别

0 == false
0 !== false

1 vs. 'true'

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

空字符串 '' 与 false 的区别

'' == false
'' !== false

2
你能否加入一些使用 === 的示例,以便更全面地演示? - Michael Haren
示例已添加,如果您有其他需要明确了解的,请告诉我。 - defines

4

第一个是布尔类型,第二个是字符串。

你可以通过以下方式看到它们的不同。

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

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

同时,您也可以查看此结果的内容:

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

你还应该学习这个类型比较表,它提供了非常实用的信息,可以帮助你更好地理解PHP。


我也强烈怀疑使用字符串进行==比较会更慢,因为你必须比较整个字符串。所以这也算是一种不同之处。 - cgp

1

我总是尽可能使用更严格的===!==,只有在绝对需要布尔值答案时才使用它们:

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

以防万一。


这个例子没有检查布尔值的假,它检查的是一个字符串是否为“false”。 - defines

0

是的,有所不同。PHP变量(或几乎任何编程语言)中的每个值都有一个“类型”。当使用引号创建/分配值时,

$foo = 'true';

你正在创建一个类型为字符串的值,如果不加引号创建/分配值,则会创建一个类型为布尔值的变量

$bar = true;

和其他现代动态语言一样,PHP非常努力地安排事物,使您不必担心类型等问题。例如,许多语言如果两个变量的类型不同,则不允许您比较它们的相等性,因此类似于下面的代码:

if('true' == True) ... 

在Python中,''不是有效的代码(会引发异常)。另一方面,PHP试图表现得友好,并且(在幕后)说“嗯,如果您在等式操作中使用任何字符串,我们将假装该字符串是布尔类型并为true,除非它是零长度字符串”。这就是为什么90%的时间,您可以轻松地完成任何一项任务。

然而,还是有区别的。首先,运行PHP的计算机需要为字符串分配比布尔值更多的内存。在今天这个时代,这只是微不足道的量,但是节约不浪费。

更重要的是,有时PHP的类型强制转换会做出毫无意义的怪事。例如,请考虑以下内容:

if ("false" == false) { 
    echo "true\n";
} else {
    echo "false\n";
}

这个语句将会输出"false",尽管直觉上你可能认为它应该输出true,因为"true" == true的结果是true。PHP有很多类似这样的边缘情况,会表现出看似奇怪的行为。所以,在试图让一般情况更简单(比如将变量转换为人们易懂的形式)的同时,他们也使得一些不太常见的情况变得更加复杂,这可能导致难以追踪的错误。当团队中的一些人了解背后的强制转换机制,而其他人则不了解时,情况会变得非常棘手。

因此,总的来说,最好从返回成功的方法和函数中返回显式布尔值(不带引号)。有经验的程序员期望这样做,而没有经验的程序员在使用字符串时可能会感到困惑,因为一些奇怪的错误会突然出现。


0

true是一个布尔型变量,而'true'则是一个字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接