Perché controllare sia isset () che! Empty ()


269

C'è una differenza tra issete !empty. Se eseguo questo doppio controllo booleano, è corretto in questo modo o ridondante? e c'è un modo più breve per fare la stessa cosa?

isset($vars[1]) AND !empty($vars[1])

3
C'è un bel diagramma sui risultati del loro utilizzo con diversi tipi di variabili (hanno differenze) qui: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

Gli ovvi complementi esatti sono isset e is_null, ma! Empty ne copre alcuni diversi. Tutto dipende dal tipo di dati per cui stai testando.
Jeff Clayton,

Risposte:


420

Questo è completamente ridondante. emptyè più o meno una scorciatoia per !isset($foo) || !$fooed !emptyè analogo a isset($foo) && $foo. Vale a dire emptyil contrario di issetun controllo aggiuntivo per la verità di un valore.

O in altre parole, emptyè uguale a !$foo, ma non genera avvisi se la variabile non esiste. Questo è il punto principale di questa funzione: fai un confronto booleano senza preoccuparti della variabile impostata.

Il manuale lo mette così:

empty()è l'opposto di (boolean) var, tranne per il fatto che non viene generato alcun avviso quando la variabile non è impostata.

Puoi semplicemente usare !empty($vars[1])qui.


7
Ma se non ce ne $vars[1]sarà riceverà un avviso.
karim79,

6
Non ho idea da dove ho avuto quell'idea. Più uno.
karim79,

8
@karim IMO emptyè una delle funzioni più incomprese in PHP. Il piccolo frammento di "nessun avviso generato" è molto facile da trascurare. Ho dovuto scansionare la documentazione da solo alcune volte per individuarla per pubblicarla qui.
ingannare

2
empty($vars[1])non causa alcun avviso, anche $vars[1]se non è impostato, ma lo echo $vars[1]farà. Ho verificato il fatto usando echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara,

4
@Shahor Molte lingue considerano 0come false. PHP non è l'unico. Non sei ancora sicuro di quale sia il tuo reclamo.
Inganno

33

isset() verifica se è impostata una variabile e non è nulla:

http://us.php.net/manual/en/function.isset.php

empty() può restituire true quando la variabile è impostata su determinati valori:

http://us.php.net/manual/en/function.empty.php

Per dimostrarlo, prova il codice seguente con $ the_var non assegnato, impostato su 0 e impostato su 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>

12

La risposta accettata non è corretta.

isset () NON equivale a! empty ().

Se segui questa strada, creerai alcuni bug piuttosto spiacevoli e difficili da eseguire il debug. ad esempio, provare a eseguire questo codice:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb


7
La risposta accettata non suggerisce in alcun modo che issetsia equivalente a !empty.
Inganno

8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}

1
Ma non hai gestito la variabile non impostando maiuscole e minuscole.
Amil Waduwawara,

3

Vuoto basta controllare se la variabile / matrice di riferimento ha un valore se controlli il documento php (vuoto) vedrai che queste cose sono considerate emtpy

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

mentre isset controlla se la variabile isset e non null che può anche essere trovata nel documento php (isset)


2

Non è necessario.

Non viene generato alcun avviso se la variabile non esiste. Ciò significa che empty () è essenzialmente l'equivalente conciso di! Isset ($ var) || $ var == false.

php.net


2
Questo non è mai stato necessario su nessuna versione di PHP, poiché vuoto controlla già per (non) isset. Stai confondendo il fatto che vuoto ora supporta le espressioni con la domanda.
alxgb,

È vero solo cinque anni dopo.
Lennon,

2

isset($vars[1]) AND !empty($vars[1])è equivalente a !empty($vars[1]).

Ho preparato un codice semplice per mostrarlo empiricamente.

L'ultima riga è una variabile non definita.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

E codice

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

La variabile non definita deve essere valutata al di fuori della funzione, poiché la funzione stessa crea una variabile temporanea nell'ambito stesso.


0

"Vuoto": funziona solo su variabili. Vuoto può significare cose diverse per diversi tipi di variabili (consultare il manuale: http://php.net/manual/en/function.empty.php ).

"isset": controlla se la variabile esiste e controlla un vero valore NULL o falso. Può essere disinserito chiamando "unset". Ancora una volta, controlla il manuale.

L'uso di uno dei due dipende dal tipo di variabile che si sta utilizzando.

Direi che è più sicuro controllare entrambi, perché stai verificando innanzitutto se la variabile esiste e se non è NULL o vuota.


3
@szahn "più sicuro per verificare entrambi", - come programmatore puoi controllare tutto ciò che desideri per la sicurezza. Ma se il tuo codice è ridondante, puoi essere ridondante come programmatore.
Madlopt

0

se utilizziamo la stessa pagina per aggiungere / modificare tramite il pulsante Invia come di seguito

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

quindi non dovremmo usare

isset($_POST['edit_id'])

bcoz edit_idè sempre impostato indipendentemente dal fatto che si tratti di aggiungere o modificare la pagina, invece dovremmo usare la verifica sotto la condizione

!empty($_POST['edit_id'])

post precedente è stato inviato bcoz premo invio per errore, ecco la mia risposta completa ... perché downvote? :(
diEcho il

0
  • Dal sito Web PHP, facendo riferimento alla empty()funzione:

Restituisce FALSEse varha un valore non vuoto e diverso da zero.

Questa è una buona cosa da sapere. In altre parole, tutto da NULL, a 0a "" tornerà TRUEquando si utilizza la empty()funzione.

  • Ecco la descrizione di ciò che isset()restituisce la funzione:

Restituisce TRUEse varesiste; FALSEaltrimenti.

In altre parole, solo le variabili che non esistono (o le variabili con NULLvalori rigorosamente ) restituiranno FALSEla isset()funzione. 0Verranno restituite tutte le variabili che hanno qualsiasi tipo di valore, sia esso una stringa di testo vuota, ecc TRUE.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.