2009-08-08 10 views
18

Questo seguito non sembra funzionare come mi sarei aspettato che, anche se eventi $ _GET [ 'friendID'] = 55 sta tornando NULLsemplice PHP isset prova

<?PHP 

$_GET['friendid'] = 55; 

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

echo $friendid; 
exit; 

?> 
+5

Va eco 'vuoto', perché avete le espressioni del ternario operatore all'indietro. –

risposta

36

Rimuovere il !. Non vuoi negare l'espressione.

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

Ok che funziona però io non capisco perché questo accade, $ _GET [ 'friendID'] = ''; non mostra vuoto, non dovrebbe essere considerato un valore nullo? – JasonDavis

+0

'' è una stringa vuota, ma la variabile è ancora impostata. –

+4

che non ha nulla a che fare con succhiare, ma con il fatto che una variabile può essere dichiarata ($ var) o inizializzato ('bla' $ var =). una variabile non dichiarata e una variabile dichiarata e inizializzata come una stringa vuota non è la stessa. –

0

se friendID è NON set, friendID = friendID altrimenti friendID = vuoto

1

Dalla tua risposta a Philippe Penso che è necessario avere uno sguardo alle differenze tra empty e isset.

In sintesi isset() restituirà booleano TRUE se esiste la variabile. Quindi, se si dovesse fare

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

$ esiste sarà vero da $ _GET [ 'friendID'] esiste. Se questo non è ciò che vuoi, ti suggerisco di guardare nel vuoto. Empty restituirà TRUE sulla stringa vuota (""), che sembra essere quello che ti aspetti. Se si utilizza vuoto, si prega di fare riferimento alla documentazione che ho collegato, ci sono altri casi in cui vuoto restituirà true dove non ci si può aspettare, questi casi sono esplicitamente documentati al link sopra.

HTH.

5

Attualmente si sta lavorando con l'operatore ternario:

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

rottura verso il basso per un if-else dichiarazione e sembra che questo:

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

Guardate quello che sta realmente accadendo nella dichiarazione if :

!isset($_GET['friendid']) 

Annotare il punto esclamativo (!) di fronte alla funzione isset. È un altro modo per dire "il contrario di". Quello che stai facendo qui è verificare che non ci sia già un valore impostato in $_GET['friendid']. E se è così, $friendid dovrebbe assumere quel valore.

Ma in realtà, si spezzerebbe dal $_GET['friendid'] non esiste nemmeno. E non puoi prendere il valore di qualcosa che non c'è.

Riprendendo dall'inizio, è stato impostato un valore per $_GET['friendid'], in modo che la prima condizione if sia ora falsa e passata all'opzione else.

In questo caso, impostare il valore della variabile $friendid su empty.

Quello che si desidera è rimuovere l'esclamazione e quindi il valore di $friendid assumerà il valore di $_GET['friendid'] se è stato precedentemente impostato.

2

La soluzione migliore per questa domanda, vale a dire se è anche necessario "verificare la stringa vuota", è empty().

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

empty() non solo controlla se la variabile è impostata, ma restituisce aggiunta falso se viene alimentata qualcosa che potrebbe essere considerato 'vuoto', come una stringa vuota, array vuoto, il numero intero 0, boolean false, ...

11

Se siete pigri e rischioso, è possibile utilizzare error control operator @ e breve forma di ternary operator.

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

Sono venuto qui in cerca di una forma condensata della struttura di controllo pubblicato nella risposta, e il vostro è perfetto. Grazie. –

+2

Solo per notare che questa soluzione è più lento, può interferire con gestori di errori (scritto male) personalizzati, ecc e un'istruzione if sarebbe eseguire più velocemente. Ma ciò non significa che sia malvagio. – thomasrutter

0

Va bene, io sto avendo un problema simile non avere familiarità con la! situazione come quella di jasondavis.

tipo di confusione, ma scoprire non avendo la! come in ... isset ($ avar) rispetto a! isset ($ avar) può fare la differenza.

Quindi, con l'! al suo posto, è più affermando un sì come in

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 molto meno confusione con se A $ = "" allora .... lavorarlo. (o se $ A = "" per quelli di PHP).

Trovo questo uso di stringhe e variabili tutte le stringhe di essere molto scoraggiante, a volte. Anche attraverso la confusione, posso davvero capire perché ... mi rende difficile tenere le cose un po 'difficili da capire.

35

Come di PHP 7's release, è possibile utilizzare l'operatore null-coalescenza (doppio "?") Per questo:

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

In PHP 5.3+, se tutto si sta verificando su è un "truthy" valore, puoi usare l'operatore "Elvis" (nota che questo non controlla l'isset).

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

Esattamente quello che stavo cercando, grazie. –

+1

? :-) uh huh huh – Greg

0

Sto usando Null coalescing operator operatore in se condizione come questa

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

che equivale a

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