2009-06-15 16 views
5

Domanda veloce. C'è una differenza traPHP true & 'true' difference

$success = true; 

e

$success = 'true'; 

so che non e '==' sono gli uni agli altri, ma c'è una differenza nel loro utilizzo?

MODIFICA: ho trovato che usare '===' invece di '==' quando si vede se $ successo è falso risolto il mio problema. La mia domanda ora è che dovrei usare le stringhe in un caso come il seguente, e continuare con "=="?

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

Ecco una parte della classe ..

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

Puoi tenerlo molto più semplice poiché ti interessa solo se lo stato login è impostato, e non importa a che cosa è impostato. Il var $ loginsuccess sarà sempre vuoto di default, a meno che non venga restituito qualcosa (qualunque). Quindi, nella funzione ProcessLogin(), semplicemente "return true;" invece di usare la variabile $ successo. Quindi prova per: if ($ loginsuccess) {// great, ha funzionato} else {// fail}.È inoltre preferibile utilizzare il modulo originale, invece di emettere lo stesso modulo in caso di errore con codice duplicato. Quindi, quando è necessario modificare qualcosa, è sufficiente correggere il modulo originale/singolo. – Alec

risposta

0

vero è un valore booleano, 'true' è una stringa.

4

Il primo è un booleano. 2a è una stringa

Si può vedere la loro differenza con questo.

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

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

E anche controllare il risultato da questa

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

Si dovrebbe anche studiare this type comparison table. reale informazioni ordinata e ti aiuta a capire un po 'più di PHP.

+0

Opposto forse? :) – Svish

+0

Whoops sì, mi dispiace. Risolto il problema –

+0

Sospetto anche che il confronto == che utilizza una stringa sia più lento in quanto è necessario confrontare l'intera stringa. Quindi conta anche come diff. – cgp

13

Qualsiasi stringa non vuota restituisce true e una stringa vuota restituisce false. Lo script che segue potrebbe far luce per voi:

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

?> 

Ecco l'output:

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

Come richiesto, ecco alcuni altri esempi di confronto == === con per diversi valori.

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

?> 

uscita:

'vero' vs vero

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

'false' vs vero

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

1 vs vero

1 == true 
1 !== true 

0 vs falso

0 == false 
0 !== false 

1 vs.'True'

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

stringa vuota '' vs falso

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

Puoi aggiungere alcuni esempi con === per una dimostrazione più completa? –

+0

Esempi aggiunti come richiesto, fammi sapere se ci sono altri che vorresti vedere esplicitamente. – defines

1

cerco sempre di usare il più restrittivo === o !== quando ho bisogno assolutamente positivamente una risposta booleana, quindi:

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

Per ogni evenienza.

+0

Questo esempio non sta verificando per booleano falso, esso controlla una stringa che è 'falso'. – defines

0

Sì, c'è una differenza. Ogni valore in una variabile PHP (o quasi in qualsiasi linguaggio di programmazione) ha un "tipo". Durante la creazione/assegnazione di un valore con le citazioni,

$foo = 'true'; 

si sta creando un valore il cui tipo è una stringa, e durante la creazione/assegnazione di un valore senza virgolette, si sta creando una variabile il cui tipo è booleano

$bar = true; 

Come altri linguaggi moderni e dinamici, PHP cerca davvero di organizzare le cose in modo tale da non doversi preoccupare di cose come il tipo. Ad esempio, un sacco di lingue non permette di confrontare l'uguaglianza di due variabili se non sono dello stesso tipo, in modo da qualcosa come

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

non è codice valido in python (si otterrà un eccezione). PHP, d'altra parte, cerca di essere gentile e (dietro le quinte) dice "bene, se si usa una stringa in un'operazione di uguaglianza, faremo finta che la stringa sia di tipo boolean e true, a meno che non sia una lunghezza zero stringa". Ecco perché, il 90% delle volte, puoi fare a meno di farlo.

Tuttavia,, ci sono differenze. Per iniziare con il pedante, il computer su cui è in esecuzione PHP ha bisogno di mettere da parte più memoria per una stringa che per un booleano. In questo giorno ed età è una quantità insignificante, ma non sprecare/non volere.

Ancora più importante, però, ci sono momenti in cui la coercizione di tipo PHP fa cose strane che non hanno senso. Ad esempio, si consideri il seguente

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

Questa dichiarazione sarà echo "false", anche se intuitivamente faresti cosa sarebbe eco vero, dal momento che "vero" == true rimane vera. Ci sono molti casi limite come questo in cui PHP agirà in modi apparentemente strani. Quindi, nel tentativo di semplificare il caso generale (convertiamo le variabili per le persone), hanno reso alcuni casi meno comuni più complessi, il che può portare a errori difficili da rintracciare. Le cose diventano davvero difficili quando alcune persone nella tua squadra comprendono la coercizione dietro le quinte e altre no.

Quindi, in linea di massima, è sempre meglio restituire booleani espliciti (senza virgolette) da metodi e funzioni che restituiscono successo. I programmatori esperti lo aspettano e i programmatori inesperti saranno sconcertati da alcuni dei bug che si aprono quando vengono usate le stringhe.

Problemi correlati