2009-07-19 18 views

Respuesta

17

isset() es la forma habitual de hacer esto:

if (!isset($blah)) { 
    $blah = 'foo'; 
} 

Nota: puede asignar null a una variable y se le asignará. Esto arrojará resultados diferentes con isset() y is_null(), por lo que debe tener claro lo que quiere decir con "no asignado". Ver Null vs. isset(). Este también es un caso en el que debe tener cuidado con la conversión automática de tipos, lo que significa que usa !=/== o ===/!== dependiendo del resultado deseado.

Puede usar una taquigrafía booleana para esto también (que es lo que es el operador de Perl ||=). A partir de PHP 5.2.x no hay operador como usted habla. En Perl:

$a ||= $b; 

es equivalente a:

$a = $a || $b; 

Usted puede hacer la segunda forma en PHP PHP, pero tiene algunas reglas sobre cobardes type juggling. Ver Converting to boolean:

Al convertir a boolean, los siguientes valores se consideran FALSO:

  • la booleanFALSE
  • la integer 0 (cero)
  • la float 0,0 (cero)
  • vacío string, y string "0"
  • un array con cero elementos
  • un object con cero variables miembro (PHP 4 solamente)
  • el tipo especial NULL (incluyendo variables no definidas)
  • SimpleXML objetos creados a partir de etiquetas vacías

Cualquier otro valor se considera VERDADERO (incluido cualquier recurso).

Así que después de:

$a = 0; 
$a = $a || 5; 

$ sería igual a un 5. De la misma manera:

$a = 0; 
$b = ''; 
$c = $a == $b; // true 
$d = $a === $b; // false 

usted tiene que mirar hacia fuera para estas cosas.

+1

$ a = isset ($ a)? $ a: $ b; es una abreviatura de la primera muestra de código – niteria

+0

$ a = 0; $ a = $ a || 5; echo $ a; // booleano TRUE – eyelidlessness

+0

Curiosamente ... echo $ a == 5? 'verdadero Falso'; // true - pero - echo $ a - 1; // 0 – eyelidlessness

0

¿Qué le parece usar un par de operadores ternarios anidados?

Para mí es la forma más fácil de resolver su problema. Y como puede usar operadores ternarios anidados, debería poder agregar más controles si es necesario.

$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

Es casi la misma cantidad de código y debería funcionar ... a menos que te haya entendido mal. Si ese es el caso, lo siento.

En comparación con el código original informados a medida ejemplo, la longitud es casi lo mismo:

$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default"; 
- vs - 
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

operadores ternarios anidados pueden ser un poco confuso, así que aquí lo tienes con los comentarios:

// Is $var set? 
    $var = isset($var) ? 
     // TRUE: It is, use $var 
     $var : 
     // FALSE: $var is not set, run check1 
     ($i=check1()) ? 
     // TRUE: the function check1 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, run check2 
     ($i=check2()) ? 
     // TRUE: the function check2 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, set default value 
     "default" ; 
+1

Los operadores ternarios anidados deberían dar como resultado una 'UnreadableOverflowException' – Dan

14
isset($foo) || $foo = 'bar'; 
+1

Eso es genial. Parece obvio, pero nunca pensé en probarlo. – eyelidlessness

0

No lo he intentado todavía, pero he querido jugar con PECL Operator durante años.

5

desde PHP 5.3 se puede utilizar:

$result = $result ?: check1(); 
1

me ocurrió con esta función que tiene un beneficio adicional de encerrar a los avisos variable no definida inútiles. Está lo suficientemente cerca del comportamiento de Javascript para mí:

function default_value(&$var, $default) { 
    return isset($var) ? $var : $default; 
} 

$want_something = default_value($_POST['mightbeunset'], false); 
Cuestiones relacionadas