2010-11-17 22 views
5

Con questa pagina di prova:Utilizzo di PHP 5.3:? Operatore

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

Non capisco l'uscita sto ottenendo quando la pagina non è definito:

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

Perché il messaggio di errore? È PHP 5.3; perché non riecheggia "1"?

+5

Praticamente non correlato, ma tu vuoi veramente '1', non' '1''. – ThiefMaster

+1

Sulla riga di comando, questo stampa 1 va bene: 'php -r 'echo (int) $ pippo?: 1;'' (PHP 5.3.3, si noti la mancanza di errori a causa della segnalazione di errori in silenzio). Puoi provare a farlo e vedere cosa fa? Dice davvero "** errore **, indice indefinito"? – deceze

+2

È ed è sempre stato un avviso. Quel "messaggio di errore" è sicuramente scritto a mano. – ThiefMaster

risposta

12

Il modo corretto (a mio parere) sarebbe:

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

Anche se è stato utilizzato il nuovo stile, si avrebbe problemi con ?page=0 (come 0 è risultata falsa). "Nuovo" non è sempre meglio ... devi sapere quando usarlo.

+0

Sì ... l'operatore?: È inutile per quello ... anche se "restituire expr1 se non è disinserito/vuoto, altrimenti l'operatore expr2" sarebbe fantastico non l'hanno mai aggiunto. – ThiefMaster

+0

no no no, voglio usare il nuovo stile – Isis

+2

+1 per ternario op – mepcotterell

2

È perché si sta cercando di typecast qualcosa che è undefined: (int) $ _GET [ 'pagina']

Rimuovere il (int) o impostare il typecast dopo la linea condizionale.

+0

L'errore persiste ancora – Isis

+0

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

3

Purtroppo si può utilizzare per lo scopo che desideri utilizzare per:

Espressione expr1:? Rendimenti expr3 expr1 se espressione1 è TRUE, e expr3 altrimenti.

Quindi sarà necessario utilizzare isset o empty() - l'operatore ?: non include un controllo isset. Quello che è necessario utilizzare è:

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

Solo per completezza, un altro modo per raggiungerlo è quello di tirare operatore Classifica:

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

Molte persone percepiscono questo come illeggibile però, anche se è più breve di isset (costrutti).

Oppure, se si utilizza oggetti di input o di qualsiasi altra classe di utilità:

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

Il tuo primo esempio genera un errore, se l'indice 'page' non esiste, non è vero? – DanMan

+0

@DanMan Solleva un * Avviso *. – mario

+0

Sì, questo è quello che intendevo. Grazie per il chiarimento. – DanMan

1

Se troppo grosso è la vostra preoccupazione, come su di una funzione di supporto?

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

allora si può solo usare:

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

che è pulito e gestisce i valori non definiti.