Preciso verificar se o valor está definido como qualquer coisa, incluindo nulo. isset
trata os valores nulos como indefinidos e retorna false
. Tome o seguinte como exemplo:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
Observe que $bar
é indefinido.
Preciso encontrar uma condição que satisfaça o seguinte:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
Alguma ideia?
isset
= está definido?, Sua variável está definida como nula. Eu perdi muito tempo por causa deste ...Respostas:
IIRC, você pode usar
get_defined_vars()
para isso:fonte
get_defined_vars
felizmente lida com o escopo.get_defined_vars()
:array_key_exists('foo', compact('foo'))
. Ou mais rápido, se testando um mundial:array_key_exists('foo', $GLOBALS)
.Se você estiver lidando com propriedades de objeto que podem ter um valor NULL, você pode usar: em
property_exists()
vez deisset()
fonte
Veja Melhor maneira de testar a existência de uma variável em PHP; isset () está claramente quebrado
fonte
Descobri que
compact
é uma função que ignora variáveis não definidasnull
, mas age sobre as definidas como , então, quando você tem uma grande tabela de símbolos local, imagino que você possa obter uma solução mais eficiente em relação à verificaçãoarray_key_exists('foo', get_defined_vars())
usandoarray_key_exists('foo', compact('foo'))
:Atualizar
A partir do PHP 7.3 compact () irá avisar sobre valores não configurados, então infelizmente esta alternativa não é mais válida.
fonte
compact
. No entanto, votei positivamente porque é útil em uma situação: se você quiser saber sefoo
existe no contexto atual , independentemente de onde veio - se você não se importa se é local ou global, apenas queira saber se existe.get_defined_vars
. Veja aqui .O seguinte código escrito como uma extensão PHP é equivalente a array_key_exists ($ name, get_defined_vars ()) (graças a Henrik e Hannes).
fonte
Você pode usar is_null e empty ao invés de isset (). Vazio não exibe uma mensagem de erro se a variável não existir.
fonte
isset
.is_null
tem o mesmo problema queis_set
: não consegue distinguir entre "não definido" e "definido como nulo", que é o problema do OP.empty
é ainda pior, como Calum aponta.Aqui está uma solução boba usando xdebug. ;-)
fonte
is_null($bar)
retorna verdadeiro, uma vez que não possui nenhum valor. Como alternativa, você pode usar:para verificar se
$bar
está definido e só retornará verdadeiro se:fonte
if(isset($bar))
dá falso quando$bar = null
.$bar = "test"
).isset($bar)
retorna falso, mesmo depois$bar = null;
.