2009-06-15 9 views
5

Question rapide. Y at-il une différence entrePHP true & 'true' difference

$success = true; 

et

$success = 'true'; 

Je sais qu'ils ne sont pas « == » à l'autre, mais est-il une différence dans leur utilisation?

EDIT: Je trouve que l'utilisation « === » au lieu de « == » en voyant si le succès de $ est faux résolu mon problème. Ma question est maintenant, est-ce que je devrais juste employer des cordes dans un cas comme ci-dessous, et coller avec '=='?

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

est ici une partie de la 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

Vous pouvez le garder beaucoup plus simple puisque vous êtes uniquement intéressé par le fait que le loginstatus soit ou non défini, et peu importe ce que vous avez défini. Le var $ loginsuccess sera toujours vide par défaut, à moins que quelque chose (quel que soit) soit retourné. Donc, dans la fonction ProcessLogin(), simplement "return true;" au lieu d'utiliser la variable $ success. Ensuite, testez: if ($ loginsuccess) {// super, ça marche} else {// fail}.Il est également préférable d'utiliser le formulaire d'origine, au lieu de sortir le même formulaire en cas d'échec avec un code en double. Ensuite, lorsque vous avez besoin de changer quelque chose, il vous suffit de corriger le formulaire original/unique. – Alec

Répondre

0

vrai est un booléen, 'true' est une chaîne.

4

Premier est un booléen. 2 est une chaîne

Vous pouvez voir leur différence avec cela.

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

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

Et aussi vérifier le résultat de cette

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

Vous devriez aussi étudier this type comparison table. réel des informations propres et vous aide à comprendre PHP un peu plus.

+0

En face peut-être? :) – Svish

+0

Oups, excusez-moi. Fixe –

+0

Je soupçonne également fortement que la comparaison == en utilisant une chaîne est plus lente que vous devez comparer la chaîne entière. Donc, cela compte aussi comme un diff. – cgp

13

Toute chaîne non vide et la valeur TRUE une chaîne vide devient fausse. Le script suivant pourrait jeter un peu de lumière pour vous:

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

?> 

est ici la sortie:

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

Comme l'a demandé, voici quelques exemples comparant == === avec pour différentes valeurs.

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

?> 

sortie:

'vrai' vs vrai

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

'faux' vs vrai

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

1 vs vrai

1 == true 
1 !== true 

0 vs faux

0 == false 
0 !== false 

1 vs.'True'

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

chaîne vide '' vs faux

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

Pouvez-vous ajouter quelques exemples avec === pour une démonstration plus complète? –

+0

Les exemples ajoutés comme demandé, laissez-moi savoir s'il y en a d'autres que vous aimeriez voir. – defines

1

J'essaie toujours d'utiliser plus restrictive === ou !== quand j'ai besoin absolument positivement une réponse booléenne, donc:

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

Juste au cas où.

+0

Cet exemple ne vérifie pas booléen faux, il vérifie une chaîne qui est 'faux'. – defines

0

Oui, il y a une différence. Chaque valeur dans une variable PHP (ou presque n'importe quel langage de programmation) a un "type". Lors de la création/l'attribution d'une valeur avec des guillemets,

$foo = 'true'; 

vous créez une valeur dont le type est une chaîne, et lors de la création/l'attribution d'une valeur sans les guillemets, vous créez une variable dont le type est booléenne

$bar = true; 

Comme d'autres langages modernes et dynamiques, PHP essaie vraiment d'arranger les choses de manière à ne pas avoir à se soucier de choses comme le type. Par exemple, beaucoup de langues ne vous laissera pas comparer l'égalité de deux variables si elles ne sont pas du même type, donc quelque chose comme

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

n'est pas un code valide en python (vous obtiendrez une exception). PHP, en revanche, essaie d'être gentil et (dans les coulisses) dit "bien, si vous utilisez une chaîne dans une opération d'égalité, nous allons prétendre que la chaîne est de type boolean et true, sauf si c'est une longueur nulle chaîne". C'est pourquoi, 90% du temps, vous pouvez vous en sortir.

Cependant,, il existe des différences. Pour commencer avec le pédant, l'ordinateur sur lequel PHP s'exécute doit mettre de côté plus de mémoire pour une chaîne que pour un booléen. En ce jour et l'âge c'est une quantité triviale, mais ne gaspille pas/ne veut pas. Plus important encore, il y a des moments où la coercition de type de PHP fait des choses bizarres qui n'ont aucun sens. Par exemple, considérons le

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

suite de cette déclaration fera l'écho « false », même si vous intuitivement ce serait chose ferais écho vrai, puisque « true » == true comme vrai évalue. Il y a beaucoup de cas de pointe comme celui-ci où PHP agira de façon apparemment étrange. Ainsi, en essayant de simplifier le cas général (convertissons les variables pour les personnes), ils ont rendu certains cas moins courants plus complexes, ce qui peut rendre difficile le repérage des bogues. Les choses deviennent vraiment méchantes lorsque certaines personnes de votre équipe comprennent la coercition dans les coulisses et d'autres pas. Donc, en général, il est toujours préférable de renvoyer des booléens explicites (sans guillemets) à partir des méthodes et des fonctions qui retournent le succès. Les programmeurs expérimentés s'y attendent et les programmeurs inexpérimentés seront déconcertés par certains des bogues qui apparaissent lorsque des chaînes sont utilisées à la place.

Questions connexes