2009-06-15 11 views
5

Schnelle Frage. Gibt es einen Unterschied zwischenPHP wahr & 'wahr' Unterschied

$success = true; 

und

$success = 'true'; 

Ich weiß, sie sind nicht ‚==‘ zueinander, aber gibt es einen Unterschied im Umgang mit ihnen?

EDIT: Ich fand, dass die Verwendung von '===' anstelle von '==', wenn Sie sehen, wenn $ Erfolg falsch ist, löste mein Problem. Meine Frage ist jetzt, sollte ich einfach Strings in einem Fall wie unten verwenden und bei '==' bleiben?

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

Hier ist ein Teil der Klasse ..

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

Sie können es viel einfacher halten, da Sie nur daran interessiert sind, ob der loginatus gesetzt ist oder nicht, und es spielt keine Rolle, auf was es eingestellt ist. Der var $ loginsuccess ist standardmäßig immer leer, es sei denn irgendetwas (was auch immer) wird zurückgegeben. Also, in der ProcessLogin() - Funktion, einfach "return true;" anstatt die $ success-Variable zu verwenden. Testen Sie dann nach: if ($ loginsuccess) {// großartig, es hat funktioniert} else {// fail}.Es ist auch am besten, das ursprüngliche Formular zu verwenden, anstatt dasselbe Formular bei fehlgeschlagenem Duplikatcode auszugeben. Wenn Sie etwas ändern müssen, müssen Sie nur das Original/Einzelformular korrigieren. – Alec

Antwort

0

wahr ein boolean ist, 'true' ist eine Zeichenfolge.

4

Zuerst ist ein Boolean. 2. ist eine Zeichenfolge

Sie können ihren Unterschied mit diesem sehen.

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

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

Und prüfen Sie auch das Ergebnis aus dieser

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

Sie auch this type comparison table. Echt ordentlich Informationen studieren sollte und hilft Ihnen zu verstehen ein bisschen mehr PHP.

+0

Gegenüber vielleicht? :) – Svish

+0

Whoops ja, Entschuldigung. Fixed –

+0

Ich würde auch stark vermuten, dass der == Vergleich mit einer Zeichenfolge langsamer ist, da Sie die gesamte Zeichenfolge vergleichen müssen. Das zählt also auch als Diff. – cgp

13

Jede nicht leere Zeichenfolge wird als wahr ausgewertet und eine leere Zeichenfolge wird als false ausgewertet. Das folgende Skript könnte etwas Licht für euch vergossen:

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

?> 

Hier ist die Ausgabe:

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

Wie gewünscht, hier sind einige weitere Beispiele == mit === für verschiedene Werte zu vergleichen.

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

?> 

Ausgang:

'true' vs. wahre

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

'false' vs. wahr

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

1 vs. wahr

1 == true 
1 !== true 

0 vs. falschen

0 == false 
0 !== false 

1 vs.'True'

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

leerer String '' vs. falsch

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

Können Sie einige Beispiele mit === für eine umfassendere Demonstration hinzufügen? –

+0

Beispiele hinzugefügt, wie angefordert, lassen Sie mich wissen, wenn es andere gibt, die Sie gerne sehen möchten. – defines

1

ich immer versuchen, die restriktivere === oder !== zu verwenden, wenn ich absolut positiv eine boolean Antwort benötigen, so:

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

Nur für den Fall.

+0

In diesem Beispiel wird nicht nach boolean false gesucht, es wird nach einer Zeichenfolge gesucht, die "false" lautet. – defines

0

Ja, es gibt einen Unterschied. Jeder Wert in einer PHP-Variablen (oder fast jeder Programmiersprache) hat einen "Typ". Bei der Erstellung/Wert mit Anführungszeichen zuweisen,

$foo = 'true'; 

Sie einen Wert, dessen Art zu schaffen, ist eine Zeichenfolge, und bei der Erstellung/Wert ohne Anführungszeichen zuweisen, erstellen Sie eine Variable, deren Typ boolean

$bar = true; 

Wie einige andere moderne, dynamische Sprachen, versucht PHP wirklich, Dinge so zu arrangieren, dass Sie sich nicht um Dinge wie Typ kümmern müssen. Zum Beispiel werden viele Sprachen lassen Sie nicht die Gleichheit von zwei Variablen zu vergleichen, wenn sie nicht vom gleichen Typ sind, so etwas wie

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

ist nicht gültigen Code in Python (Sie werden eine bekommen Ausnahme). PHP hingegen versucht, nett zu sein und (hinter den Kulissen) sagt: "Nun, wenn Sie einen String in einer Gleichheitsoperation verwenden, werden wir so tun, als ob der String vom Typ boolean und true ist, es sei denn, es ist eine Nulllänge Zeichenfolge ". Deshalb können Sie in 90% der Fälle davonkommen.

Jedoch gibt es Unterschiede. Um mit der Pedantik zu beginnen, muss der Computer, auf dem PHP läuft, mehr Speicher für einen String reservieren als für einen Boolean. In der heutigen Zeit ist es eine triviale Menge, aber Verschwendung nicht/will nicht.

Noch wichtiger ist, gibt es Zeiten, in denen PHP-Typ-Zwangs macht seltsame Dinge, die keinen Sinn machen. Betrachten wir zum Beispiel die folgende

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

Diese Erklärung wird „false“ Echo, obwohl intuitiv würde man, was es wahr Echo würde, da „true“ == true als wahr ausgewertet wird. Es gibt viele Randfälle wie diese, in denen PHP auf scheinbar seltsame Weise agiert. Wenn wir also versuchen, den allgemeinen Fall einfacher zu machen (lassen Sie uns Variablen für Menschen konvertieren), haben sie einige weniger häufige Fälle komplexer gemacht, was dazu führen kann, dass Fehler nur schwer aufgespürt werden können. Dinge werden wirklich gnarly, wenn einige Leute in Ihrem Team verstehen, die hinter den Kulissen Nötigung, und andere nicht.

Also, im Großen und Ganzen ist es immer am besten, explizite Boolesche Werte (keine Anführungszeichen) von Methoden und Funktionen zurückzugeben, die erfolgreich sind. Erfahrene Programmierer erwarten es und unerfahrene Programmierer werden von einigen Bugs verblüfft, die auftreten, wenn Strings verwendet werden.

Verwandte Themen