2011-02-04 18 views
13

estaba leyendo this question y vi esta línea:?¿Cuál es la mejor manera de convertir una variable a un booleano en php?

if ($a == $b) { return true } else { return false } 

Y me llevó a preguntarse, ¿cuál es la mejor manera de convertir una variable de tipo desconocido (podría ser una cadena, podría ser int; quién sabe quién ¿Cuidados?) a un booleano?

Por supuesto, if ($var) { return true; } else { return false; } haría el truco, pero creo que return $var ? true : false; es probablemente mejor.

Por lo demás:

  • return $var && true
  • return $var || false
  • return !empty($var)

son todos probablemente mejor, pero hay una manera mejor para echar a bool? Más importante aún, ¿qué lo hace mejor?

Editar para aclarar:

Esto no fue escrito con la intención de ser una lista exhaustiva de las formas de emitidos a un valor lógico. Mi pregunta es específicamente en fundición explícita. Antes de saber empty utilicé isset($var) && $var, ya que evitaría errores en las variables no declaradas. Ahora uso !empty($var) ya que es más rápido escribir.

!empty tiene la (des) ventaja de no arrojar ningún error E_NOTICE cuando la variable no está definida. Esto podría considerarse bueno si está verificando las variables $_GET o $_SESSION, para la mayoría de las demás variables, supongo que esto puede considerarse malo, ya que podría ocultar problemas donde una variable no se inicializó donde debería haber sido inicializada.

Tenía curiosidad sobre si otros desarrolladores tienen otra forma de hacer las cosas que yo no sabía .

+0

Me interesaría saber por qué cree que hay una mejor manera de hacerlo. Yo, por ejemplo, no creo que exista * el mejor código *. Por supuesto, puede encontrar criterios objetivos hasta cierto punto, pero en un punto se está volviendo subjetivo. –

+0

@Felix Kling, es una pregunta subjetiva para estar seguro, no quería usar * best *, pero me resulta difícil encontrar buenos parámetros para juzgar algo tan simple como el lanzamiento booleano: ¿el más rápido? apenas importa. más corto para escribir? ¿legibilidad? – zzzzBov

+0

Fuera de interés, [ejecuté una prueba rápida] (https://eval.in/431853) para ver cuál era más rápido y encasillarlo explícitamente usando '(bool)' era consistentemente más rápido. – Styphon

Respuesta

20

Las dos formas son:

  1. conversión explícita:

    Esto es cuando lanzas explícitamente la variable utilizando el operador de conversión literal (bool).

    return (bool) $expression; 
    
  2. conversión implícita (usando operadores):

    Aquí es donde el tipo se deduce de la expresión. En PHP, esto incluye logical operators y comparison operators, y cualquier constructo función/idioma que espera un booleano como if y while:

    return !!$expression; 
    

    o

    return $expression == true; 
    

    o

    return $a == $b; 
    

    o

    return $a > 1; 
    

    o

    if ($a) 
    

Todos los métodos caerán en una de estas dos categorías.

Mi sugerencia es que si utiliza cualquier operador (==, !=, >, etc.), no moleste el casting. Pero si solo está devolviendo una variable, expórtela explícitamente ...

4

Lo que he visto con mayor frecuencia en JavaScript: negación doble

return !!$var; 

Explicación:

!$var evalúa $var a su opposite boolean value (si $var hay un valor booleano, es converted to boolean first (type conversion)) y el segundo ! invierte este valor nuevamente, lo que lleva al valor booleano, $var también evaluaría.

¿Es el mejor? Eso depende de tus criterios. Como ya se ha mencionado, podría ser más difícil de entender (aunque no es nada especial) pero es sin duda la versión más corta;)

También podría depender, que valora que considera como true y false.Estos valores se evalúan a false por defecto:

  • la propia FALSO boolean
  • el número entero 0 (cero)
  • el flotador 0,0 (cero)
  • la cadena vacía, y la cadena "0 "
  • una matriz con elementos cero
  • un objeto con variables miembro cero (PHP 4 solamente)
  • la NULL tipo especial (incluyendo variables no definidas)
  • objetos SimpleXML creados a partir de las etiquetas vacías

Actualización:

Creo que en general se puede decir, que cada código que evita explícitamente volver true o false es mejor. Ya sea a través de conversión explícita o de tipo implícito. Por supuesto, explícito (por definición) debería ser más fácil de entender.

Tener un código como return $a ? true : false es redundante. Especialmente

if ($a == $b) { return true } else { return false } 

que acaba podría escribirse como return ($a == $b).

Debe haber una razón por la cual esto fue mal visto en mis alumnos;).

Update2:

evitaría expresión como return $var && true. En PHP, devolverá un valor booleano, pero p. en JavaScript o Python, devolvería el valor de $var si se evalúa como verdadero. Y en estos idiomas, este "truco" se usa a propósito para lograr ciertos efectos. Entonces, para las personas (más) familiarizadas con estos lenguajes, puede que no sea obvio (sin documentación o contexto) que solo se debe devolver un booleano.

+0

¿Cómo funciona esto con PHP? Solo estoy buscando más descripciones. –

+0

@Jared Farrish: Espero que ayude un poco. Funciona igual en PHP que en JavaScript porque '!' Funciona igual :) –

+0

@Felix - ¿Por qué funciona esto? Esa es la descripción que estaba buscando. –

2

¿cuál es la mejor forma de convertir una variable de tipo desconocido (podría ser una cadena, podría ser int; quién sabe? ¿A quién le importa?) A un booleano?

return (bool)$var; 
13

Yo personalmente siempre uso

(bool)$var; 

Creo que se trata de la manera más clara para su emisión a un valor lógico. La mayoría de las personas que vienen de otro idioma entienden esto. Otro que olvidó de su es

!!$var; 

Me parece un poco difícil de leer.

0

puede convertir:

if ((bool)$string) 

http://php.net/manual/en/language.types.type-juggling.php

Nota, en PHP desde 0 == false, es necesario utilizar la === comparador de conseguir comparación de tipos, además de la comparación del valor.

http://php.net/manual/en/language.operators.comparison.php

+0

¿Qué pasa con el casting a boolean? – zneak

+0

Cierto, no entendí eso inicialmente, ya que normalmente lanzo (int). Ver editar. –

+0

* Rascándose la barbilla * –

Cuestiones relacionadas