2009-06-15 60 views
5

快速的問題。有PHP真和'真'區別

$success = true; 

$success = 'true'; 

之間的差異,我知道他們是不是「==」給對方,但有使用它們有區別嗎?

編輯:我發現,使用'==='而不是'=='當看到$成功是錯誤解決了我的問題。我現在的問題是,我應該在下面的情況下使用字符串,並堅持'=='?

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

你可以保持它簡單得多,因爲你只關心登錄狀態是否已設置,並且它與設置無關。默認情況下,var $ loginsuccess將始終爲空,除非返回了某些內容(不管)。所以在ProcessLogin()函數中,只需「返回true」;而不是使用$ success變量。然後測試:if($ loginsuccess){//很好,工作正常} else {//失敗}。最好使用原始表單,而不是使用重複代碼輸出失敗時的相同表單。然後,當需要更改某些內容時,您只需修復原始/單一表單。 – Alec 2009-06-16 20:10:03

回答

0

真的是一個布爾值, '真' 是一個字符串。

4

首先是一個布爾值。第二個是字符串

您可以看到它們與此的區別。

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

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

而且也是從這個

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

檢查出來的結果你也應該學習this type comparison table.真實整齊的信息,並幫助您瞭解PHP多一點。

+0

對面也許? :) – Svish 2009-06-15 19:00:30

+0

呃,對不起。修正了 – 2009-06-15 19:02:06

+0

我還強烈懷疑使用字符串的==比較比較慢,因爲您必須比較整個字符串。所以這也算是一個差異。 – cgp 2009-06-15 19:02:16

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

?> 

這裏是輸出:

​​

按照要求,這裏有一些比較==與===各種價值觀更多的例子。

<?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 

'假' 與真

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

1對真

1 == true 
1 !== true 

0與假

0 == false 
0 !== false 

1比「真」

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

空字符串「」與假

'' == false 
'' !== false 
1

我總是嘗試使用更嚴格的===!==時,我絕對肯定需要一個布爾答案,所以:

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

爲了以防萬一。

0

是的,有區別。 PHP變量(或幾乎任何編程語言)中的每個值都有一個「類型」。當創建/分配引號的值,

$foo = 'true'; 

要創建一個類型爲字符串的值,並創建/分配不帶引號的值時,要創建一個變量,其類型爲布爾

$bar = true; 

像其他一些現代動態語言一樣,PHP試圖很難以這種方式安排事情,以至於不必擔心類型這樣的事情。例如,很多語言不會讓你比較兩個變量的平等,如果他們是同一類型的沒有,所以像

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

不是蟒蛇有效的代碼(你會得到一個例外)。另一方面,PHP試圖變得更好,並且(幕後)說:「好吧,如果你在等式操作中使用任何字符串,我們會假裝該字符串的類型爲boolean和true,除非它是零長度串」。這就是爲什麼,在90%的時間裏,你可以逃避。

但是,有差異。從迂腐開始,運行PHP的計算機需要爲字符串提供更多內存,而不是布爾值。在這個時代,這是一個微不足道的數字,但不浪費/不想要。

更重要的是,有些時候PHP的類型強制會做一些毫無意義的奇怪事情。例如,請考慮以下

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

該語句將回聲「假」,即使直覺你最好將呼應真實的事情,因爲「真」 ==真評估爲真。有很多像這樣的邊緣情況,PHP會以奇怪的方式進行操作。因此,爲了簡化一般情況(讓我們爲人們轉換變量),他們將一些不太常見的情況變得更加複雜,這可能導致很難追蹤錯誤。當團隊中的某些人瞭解幕後強制時,情況會變得非常糟糕,而其他人則不會。

所以,總的來說,返回成功返回的方法和函數總是最好返回顯式布爾值(無引號)。有經驗的程序員期望它和沒有經驗的程序員會被一些使用字符串時彈出的錯誤所困惑。