2009-06-15 16 views
5

Pregunta rápida. ¿Hay una diferencia entrePHP true & 'true' difference

$success = true; 

y

$success = 'true'; 

sé que no '==' son el uno al otro, pero hay una diferencia en el uso de ellos?

EDIT: encontré que usar '===' en vez de '==' al ver si $ success es falso resolvió mi problema. Mi pregunta ahora es si debería usar cadenas en un caso como el que se muestra a continuación, y seguir 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>"; 
    } 

Aquí es parte de la clase ..

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

Puedes hacerlo mucho más sencillo ya que solo estás interesado en si está configurado el estado de inicio de sesión o no, y no importa a qué se haya configurado. El var $ loginsuccess siempre estará vacío de manera predeterminada, a menos que se devuelva algo (lo que sea). Entonces, en la función ProcessLogin() simplemente "return true"; en lugar de usar la variable $ success Luego, prueba para: if ($ loginsuccess) {// great, funcionó} else {// fail}.También es mejor usar el formulario original, en lugar de generar el mismo formulario en caso de error con código duplicado. Luego, cuando necesite cambiar algo, solo tendrá que corregir el formulario original/único. – Alec

Respuesta

0

verdad es un valor lógico, 'verdadero' es una cadena.

4

Primero es un booleano. 2nd es una cadena

Puede ver su diferencia con esto.

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

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

Y también comprobar el resultado de esta

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

También debe estudiar this type comparison table. información ordenada real y ayuda a entender un poco más PHP.

+0

¿Opuesto quizás? :) – Svish

+0

Whoops sí, lo siento. Corregido –

+0

También sospecho fuertemente que la comparación == usando una cadena es más lenta ya que tiene que comparar toda la cadena. Entonces eso cuenta como una diferencia también. – cgp

13

Cualquier cadena no vacía se evalúa como verdadera y una cadena vacía se evalúa como falsa. La siguiente secuencia de comandos podría arrojar algo de luz para usted:

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

?> 

Aquí está la salida:

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

a lo solicitado, he aquí algunos ejemplos más que comparan == === con varios valores.

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

?> 

Salida:

'verdadero' frente a cierto

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

'falsa' vs. cierto

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

1 vs cierto

1 == true 
1 !== true 

0 vs falsa

0 == false 
0 !== false 

1 vs.'Verdadero'

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

cadena vacía '' vs falsa

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

¿Puede agregar algunos ejemplos con === para una demostración más completa? –

+0

Se agregaron ejemplos cuando se solicitó, avíseme si hay otros que explícitamente desea ver. – defines

1

siempre trato de usar la más restrictiva === o !== cuando tienen una necesidad imperiosa de manera positiva una respuesta booleana, por lo que:

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

Just in case.

+0

Este ejemplo no comprueba si boolean es falso, busca una cadena que sea 'falsa'. – defines

0

Sí, hay una diferencia. Cada valor en una variable PHP (o casi cualquier lenguaje de programación) tiene un "tipo". Al crear/asignar un valor entre comillas,

$foo = 'true'; 

que está creando un valor cuyo tipo es una cadena, y al crear/asignar un valor sin comillas, que está creando una variable cuyo tipo es booleano

$bar = true; 

Al igual que algunos otros lenguajes modernos y dinámicos, PHP trata de arreglar las cosas de manera que no tenga que preocuparse por cosas como el tipo. Por ejemplo, una gran cantidad de idiomas que no le permitirá comparar la igualdad de las dos variables si no son del mismo tipo, así que algo como

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

no es un código válido en Python (que obtendrá una excepción). PHP, por otro lado, trata de ser amable y (detrás de escena) dice "bueno, si usas cualquier cadena en una operación de igualdad, fingiremos que la cadena es de tipo booleano y verdadera, a menos que sea una longitud cero cuerda". Es por eso que, el 90% del tiempo, puedes salirte con la tuya.

Sin embargo,, hay diferencias. Para comenzar con el pedantic, la computadora en la que se ejecuta PHP necesita reservar más memoria para una cadena que para un booleano. En este día y edad es una cantidad trivial, pero no desperdicio/no quiero.

Más importante aún, hay veces en que la coerción de tipos de PHP hace cosas raras que no tienen sentido. Por ejemplo, considere la siguiente

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

Esta declaración se hará eco de "falsa", aunque intuitivamente és lo que se haría eco de cierto, ya que la "verdadera" == true evalúa como verdadera. Hay muchos casos extremos como este donde PHP actuará de maneras aparentemente extrañas. Por lo tanto, al tratar de simplificar el caso general (convirtamos las variables para las personas), hicieron que algunos casos menos comunes fueran más complejos, lo que puede llevar a errores difíciles de rastrear. Las cosas se ponen realmente difíciles cuando algunas personas en tu equipo entienden la coacción detrás de escena, y otras no.

Por lo tanto, en general, siempre es mejor devolver booleanos explícitos (sin comillas) de los métodos y funciones que están teniendo éxito. Los programadores experimentados lo esperan y los programadores inexpertos estarán desconcertados por algunos de los errores que surgen cuando se usan cadenas.