Alguém pode explicar as diferenças entre taquigrafia do operador ternário (?:
) e o operador coalescente nulo ( ??
) no PHP?
Quando eles se comportam de maneira diferente e quando da mesma maneira (se isso acontecer)?
$a ?: $b
VS.
$a ?? $b
Alguém pode explicar as diferenças entre taquigrafia do operador ternário (?:
) e o operador coalescente nulo ( ??
) no PHP?
Quando eles se comportam de maneira diferente e quando da mesma maneira (se isso acontecer)?
$a ?: $b
VS.
$a ?? $b
Quando seu primeiro argumento é nulo, eles são basicamente os mesmos, exceto que a coalescência nula não produzirá um E_NOTICE
quando você tiver uma variável indefinida. Os documentos de migração do PHP 7.0 têm a dizer:
O operador coalescente nulo (??) foi adicionado como açúcar sintático para o caso comum de precisar usar um ternário em conjunto com isset (). Retorna seu primeiro operando se existir e não for NULL; caso contrário, ele retornará seu segundo operando.
Aqui está um exemplo de código para demonstrar isso:
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
As linhas que têm o aviso são aquelas em que estou usando o operador ternário de taquigrafia, em oposição ao operador coalescente nulo. No entanto, mesmo com o aviso, o PHP dará a mesma resposta.
Execute o código: https://3v4l.org/McavC
Claro, isso sempre está assumindo que o primeiro argumento é null
. Uma vez que não é mais nulo, você termina com diferenças em que o ??
operador sempre retornaria o primeiro argumento, enquanto a ?:
abreviação retornaria apenas se o primeiro argumento fosse verdadeiro, e isso depende de como o PHP converteria as coisas em um valor booleano .
Assim:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
seria então $a
igual false
e $b
igual a 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
ou com objetos$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Veja: 3v4l.org/iCCa0Execute o abaixo no modo interativo php (
php -a
no terminal). O comentário em cada linha mostra o resultado.Então esta é a minha interpretação:
1. O operador nulo de coalescência -
??
:??
é como um "portão" que apenas permite a passagem de NULL .NULL
.??
é o mesmo que( !isset() || is_null() )
2. O operador ternário -
?:
?:
é como um portão que deixaanything falsy
passar - incluindoNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. qualquer coisa que cheira Falsasecho ($x ? $x : false)
?:
lançará variáveisPHP NOTICE
indefinidas (unset
ou!isset()
)3. Então doutor, quando eu uso
??
e?:
..?:
quandoempty($x)
cheques!empty($x) ? $x : $y
pode ser reduzida para$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
pode ser reduzido parafn(($x ?: $y))
??
quando!isset() || is_null()
verificação$object = $object ?? new objClassName();
4. Operadores de empilhamento ...
O operador ternário pode ser empilhado ...
Origem e crédito para este código
Esta é basicamente uma sequência de:
O operador de carvão nulo pode ser empilhado ...
Esta é uma sequência de:
Usando o empilhamento, posso encurtar isso:
Para isso:
Legal certo? :-)
fonte
Se você usar o operador ternário de atalho como este, ele causará um aviso se
$_GET['username']
não estiver definido:Então, em vez disso, você deve fazer algo assim:
O operador coalescente nulo é equivalente à instrução acima e retornará 'padrão' se
$_GET['username']
não estiver definido ou estivernull
:Observe que ele não verifica a veracidade . Ele verifica apenas se está definido e não é nulo.
Você também pode fazer isso e o primeiro valor definido (definido e não
null
) será retornado:Agora esse é um operador coalescente adequado.
fonte
A principal diferença é que
A expressão Ternary Operator
expr1 ?: expr3
retornaexpr1
se forexpr1
avaliada como,TRUE
mas por outro lado, a expressão Null Coalescing Operator(expr1) ?? (expr2)
avaliaexpr1
seexpr1
for não forNULL
O operador ternário
expr1 ?: expr3
emite um aviso se o valor do lado esquerdo(expr1)
não existir, mas, por outro lado, operador nulo de coalescência(expr1) ?? (expr2)
Em particular, não emite um aviso se o valor do lado esquerdo(expr1)
não existir, assim comoisset()
.TernaryOperator é deixado associativo
O operador de coalescência nulo é associativo correto
Agora vamos explicar a diferença entre por exemplo:
Operador ternário
(?:)
Operador de coalescência nulo
(??)
Aqui está a tabela que explica a diferença e semelhança entre
'??'
e?:
fonte
Ambos se comportam de maneira diferente quando se trata de manipulação dinâmica de dados.
Se a variável estiver vazia (''), a coalescência nula tratará a variável como verdadeira, mas o operador ternário abreviado não. E isso é algo a ter em mente.
E a saída:
Link: https://3v4l.org/ZBAa1
fonte
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.Ambos são atalhos para expressões mais longas.
?:
é a abreviação de$a ? $a : $b
. Essa expressão será avaliada como $ a se $ a for avaliada como TRUE .??
é a abreviação deisset($a) ? $a : $b
. Essa expressão será avaliada como $ a se $ a estiver definido e não nulo.Seus casos de uso se sobrepõem quando $ a é indefinido ou nulo. Quando $ a é indefinido
??
, não produz um E_NOTICE, mas os resultados são os mesmos. Quando $ a é nulo, o resultado é o mesmo.fonte
Para iniciantes:
Operador coalescente nulo (??)
Tudo é verdade, exceto
null
valores e indefinidos (atributos de índice de variável / matriz / objeto)ex:
isso é basicamente verificar se a variável (índice do array, atributo do objeto etc.) existe e não existe
null
. semelhante àisset
funçãoTaquigrafia do operador ternário (? :)
cada coisas falsas (
false
,null
,0
, string vazia) são vir como falsa, mas se é um indefinido também vir como falsa, masNotice
vai jogarex
Espero que isto ajude
fonte
Role para baixo neste link e veja a seção, ele fornece um exemplo comparativo, como visto abaixo:
No entanto, não é aconselhável encadear os operadores, pois dificulta a compreensão do código ao lê-lo posteriormente.
Essencialmente, o uso do operador coalescente tornará a verificação automática de nulo, diferente do operador ternário.
fonte
a || b || c
padrão em JS, exceto PHP do pode ser usado para booleans (false || 2
em JS é 2;false ?? 2
em PHP é false)As outras respostas são profundas e dão ótimas explicações. Para quem procura uma resposta rápida,
$a ?: 'fallback'
é$a ? $a : 'fallback'
enquanto
$a ?? 'fallback'
é$a = isset($a) ? $a : 'fallback'
A principal diferença seria quando o operador esquerdo é:
0
,''
,false
,[]
, ...)fonte
$a =
na expansão acima de??
.$a ?? 'fallback'
não define nem altera o valor de $ a. (Ele apenas retorna um valor).Parece que existem prós e contras no uso de um
??
ou outro?:
. O profissional a usar?:
é que ele avalia falso e nulo e "" o mesmo. O engodo é que ele relata um E_NOTICE se o argumento anterior for nulo. Com??
o profissional, não há E_NOTICE, mas o contrário é que ele não avalia falso e nulo da mesma forma. Na minha experiência, vi pessoas começarem a usar nulo e falso de forma intercambiável, mas depois acabaram recorrendo a modificar seu código para ser consistente com o uso de nulo ou falso, mas não ambos. Uma alternativa é criar uma condição ternária mais elaborada:(isset($something) or !$something) ? $something : $something_else
.A seguir, é apresentado um exemplo da diferença de usar o
??
operador usando null e false:Ao elaborar o operador ternário, no entanto, podemos fazer com que uma string "" falsa ou vazia se comporte como se fosse um nulo sem gerar um e_notice:
Pessoalmente, acho que seria muito bom se uma futura revisão do PHP incluísse outro novo operador:
:?
que substituísse a sintaxe acima. ou seja:// $var = $false :? "true";
Essa sintaxe avaliaria nulo, falso e "" igualmente e não lançaria um E_NOTICE ...fonte
?? null ?:
coisa é incrível, obrigado Sr. cara inteligente.fonte
Null Coalescing operator
executa apenas duas tarefas: verificawhether the variable is set
ewhether it is null
. Veja o seguinte exemplo:O exemplo de código acima afirma que
Null Coalescing operator
trata uma variável inexistente e uma variável que é definidaNULL
da mesma maneira.Null Coalescing operator
é uma melhoria sobre oternary operator
. Dê uma olhada no seguinte trecho de código comparando os dois:Portanto, a diferença entre os dois é que o
Null Coalescing operator
operador foi projetado para lidar com variáveis indefinidas melhor que oternary operator
. Visto que oternary operator
é uma abreviação deif-else
.Null Coalescing operator
não pretende substituirternary operator
, mas em alguns casos de uso, como no exemplo acima, permite escrever código limpo com menos problemas.Créditos: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
fonte
isset($_POST['fullname'])
já verificaNULL
valores - portanto,&& !is_null($_POST['fullname'])
no primeiro exemplo, é redundante de qualquer maneira #Ao usar superglobais como $ _GET ou $ _REQUEST, você deve estar ciente de que eles podem ser uma sequência vazia. Neste caso especal, este exemplo
falhará porque o valor de $ username agora é uma string vazia.
Portanto, ao usar $ _GET ou mesmo $ _REQUEST, você deve usar o operador ternário da seguinte maneira:
Agora, o valor de $ username é 'ninguém' conforme o esperado.
fonte