2010-11-17 23 views
5

Con esta página de prueba:Uso de PHP 5.3 operador?:

$page = (int) $_GET['page'] ?: '1'; 
echo $page; 

No entiendo la salida me estoy haciendo cuando no está definido página:

Request Result 
?page=2 2 
?page=3 3 
?page= 1 
?   error: Undefined index page 

Por qué el mensaje de error? Es PHP 5.3; ¿Por qué no repite "1"?

+5

Bastante relacionado, pero realmente quieres '1', no' '1''. – ThiefMaster

+1

En la línea de comandos, esto imprime 1 muy bien: 'php -r 'echo (int) $ foo?: 1;'' (PHP 5.3.3, observe la falta de error debido a que el informe de error es silencioso). ¿Puedes intentar ejecutar eso y ver qué hace? ¿Realmente dice "** error **, índice indefinido"? – deceze

+2

Es y siempre ha sido un aviso. Ese "mensaje de error" ciertamente está escrito a mano. – ThiefMaster

Respuesta

12

La forma correcta (en mi opinión) sería:

$page = isset($_GET['page']) ? (int) $_GET['page'] : 1; 

Incluso si ha utilizado el nuevo estilo, que tendría problemas con ?page=0 (como 0 evalúa a falso). "Nuevo" no siempre es mejor ... tiene que saber cuando para usarlo.

+0

Sí ... el operador: es inútil para eso ... aunque un operador "expr1 si no está desarmado/vacío, de otro modo expr2" sería increíble, nunca lo agregaron. – ThiefMaster

+0

no no no, quiero usar el nuevo estilo – Isis

+2

+1 para ternary op – mepcotterell

2

Es porque estás tratando de encasillar algo que está indefinido: (int) $ _GET [ 'página']

Retire la (int) o establecer el encasillado después de la línea condicional.

+0

El error aún persiste – Isis

+0

Intente hacer esto: $ page = 1; if (! Isset ($ _ GET ['page'])) { $ page = (int) $ _GET ['page']?: '1'; } echo $ page; – wajiw

3

Lamentablemente no se puede usar para el propósito desea utilizarlo para:

expr1 Expresión:? Rendimientos expr3 EXPR1 si expr1 se evalúa como TRUE, y expr3 lo contrario.

Así que igual tendrá que usar isset o empty() - el operador ?: no incluye una verificación isset. Lo que hay que utilizar es:

$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1; 
3

simplemente para la corrección, otra manera de lograrlo es a mi rango operador:

$page = (int)$_GET["page"] or $page = 1; 

Muchas personas perciben esto como ilegible sin embargo, aunque es más corto que isset () construcciones

O si está utilizando objetos de entrada o cualquier otra clase de utilidad:

$page = $_GET->int->default("page", 1); 
+0

Su primer ejemplo genera un error, si el índice 'page' no existe, ¿no es así? – DanMan

+0

@ DanMan Levanta un * Aviso *. – mario

+0

Sí, eso es lo que quise decir. Gracias por aclararlo. – DanMan

1

Si la hinchazón es su preocupación, ¿qué tal una función de ayuda?

function get_or($index, $default) { 
    return isset($_GET[$index]) ? $_GET[$index] : $default; 
} 

a continuación, puedes utilizar:

$page = get_or('page', 1); 

que está limpio y trata los valores no definidos.