2009-08-08 9 views
18

Esta continuación no parece funcionar cómo iba a esperar que, a pesar de evento $ _GET [ 'friendid'] = 55 se devuelva NULLsimple PHP isset prueba

<?PHP 

$_GET['friendid'] = 55; 

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

echo $friendid; 
exit; 

?> 
+5

Cabe eco de 'vacío', porque tiene las expresiones en el ternario operador hacia atrás. –

Respuesta

36

Retire la !. No quieres negar la expresión.

$friendid = isset($_GET['friendid']) ? $_GET['friendid'] : 'empty'; 
+0

Ok, eso funciona, pero no entiendo por qué sucede esto, $ _GET ['friendid'] = ''; no se muestra vacío, ¿no debería considerarse esto un valor nulo? – JasonDavis

+0

'' es una cadena vacía, pero la variable aún está configurada. –

+4

Eso no tiene nada que ver con succión, pero con el hecho de que una variable puede declararse ($ var) o inicializarse ($ var = 'bla'). una variable no declarada y una variable declarada e inicializada como una cadena vacía no es lo mismo. –

0

si friendid es NO conjunto, friendid = friendid lo contrario friendid = vacío

1

Desde su respuesta a Philippe Creo que es necesario tener un vistazo a las diferencias entre empty y isset.

Para resumir isset() devolverá booleano TRUE si la variable existe. Por lo tanto, si tuviera que hacer

$fid = $_GET['friendid'] = ""; 
$exists = isset($fid); 

$ exists será VERDADERO ya que $ _GET ['friendid'] existe. Si esto no es lo que quieres, te sugiero que lo veas vacío. Vacío devolverá TRUE en la cadena vacía (""), que parece ser lo que está esperando. Si lo usa en blanco, POR FAVOR remítase a la documentación a la que lo vinculé, hay otros casos en los que el vacío devolverá verdadero donde no puede esperar, estos casos están documentados explícitamente en el enlace de arriba.

HTH.

5

Actualmente se trabaja con el operador ternario:

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

dividirla en una declaración if-else y se ve así:

if(!isset($_GET['friendid'])) 
    $friendid = $_GET['friendid']; 
else 
    $friendid = 'empty'; 

mirar lo que está sucediendo realmente en el estado de if :

!isset($_GET['friendid']) 

Note the exclamation mark (!) delante de la función isset. Es otra forma de decir "lo contrario de". Lo que está haciendo aquí es verificar que no haya ningún valor establecido en $_GET['friendid']. Y si es así, $friendid debería tomar ese valor.

Pero en realidad, se rompería ya que $_GET['friendid'] ni siquiera existe. Y no puedes tomar el valor de algo que no está allí.

Al tomarlo desde el principio, ha establecido un valor para $_GET['friendid'], por lo que la primera condición if ahora es falsa y la pasa a la opción else.

En este caso, establezca el valor de la variable $friendid en empty.

Lo que quiere es eliminar la exclamación y luego el valor de $friendid tomará el valor de $_GET['friendid'] si se ha establecido previamente.

2

La mejor solución para esta pregunta, es decir, si también necesita 'verificar la cadena vacía', es empty().

$friendid = empty($_GET['friendid']) ? 'empty' : $_GET['friendid']; 

empty() no sólo comprueba si se establece la variable, pero, además, devuelve FALSE si se alimenta nada de lo que podría ser considerado 'vacío', tal como una cadena vacía, matriz vacía, el número entero 0, boolean falso, ...

11

Si eres flojo y arriesgado, puedes usar error control operator @ y una forma abreviada de ternary operator.

$friendid = @$_GET['friendid']?: 'empty'; 
+1

Vine aquí en busca de una forma condensada de la estructura de control publicada en la respuesta, y la tuya es perfecta. Gracias. –

+2

Solo para observar que esta solución es más lenta, puede interferir con manejadores de errores personalizados (mal escritos), etc. y una instrucción if se ejecutará más rápido. Pero eso no significa que sea malvado. – thomasrutter

0

Bien, puede que tenga un problema similar al no estar familiarizado con el! situación como jasondavis tenía.

¡Un poco confuso, pero al descubrir que no tiene! como en ... isset ($ avar) en comparación con! isset ($ avar) puede marcar la diferencia.

¡Así que con! en su lugar, es más declarando un SI como en

since $_GET['friendid'] = 55; has been initialized... 
           tell me 'no' - the opposite - that it hasn't and set it to empty. 
       $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

    where not having the ! tells me yes it has something in it, leave it be. 

       $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

era mucho menos confuso con si A $ = "" .... entonces la trabajan. (o si $ A = "" para los de PHP).

Encuentro este uso de cadenas y variables como cadenas a veces muy desalentadores. Incluso a través de la confusión, realmente puedo entender por qué ... solo hace que las cosas sean un poco difíciles de entender para mí.

35

A partir de PHP 7's release, puede utilizar el operador nulo coalescencia (doble "?") Para esto:

$var = $array["key"] ?? "default-value"; 
// which is synonymous to: 
$var = isset($array["key"]) ? $array["key"] : "default-value"; 

En PHP 5.3+, si todo lo que está mirando el es un "truthy" valor, puede usar el "operador de Elvis" (tenga en cuenta que esto no marca isset).

$var = $value ?: "default-value"; 
// which is synonymous to: 
$var = $value ? $value : "default-value"; 
+0

Exactamente lo que estaba buscando, gracias. –

+1

? :-) uh huh huh – Greg

0

estoy usando Null coalescing operator operador si la condición como esta

if($myArr['user'] ?? false){ 

lo que equivale a

if(isset($myArr['user']) && $myArr['user']){