Recentemente, eu estava revisando parte do meu código e percebi que, em um ataque de distração, havia deixado uma estrutura como a seguinte:
$guid = empty($subscription->guid) ? : $subscription->guid;
Agora, isso não estava fazendo o que deveria e está errado , mas como essa propriedade está sempre definida, agora estava funcionando bem, e não há erro de sintaxe desde o 5.3 devido à seguinte alteração :
Desde o PHP 5.3, é possível deixar de fora a parte do meio do operador ternário. A expressão expr1?: Expr3 retorna expr1 se expr1 for avaliada como TRUE e expr3 caso contrário.
Eu não estava ciente dessa mudança e agora estou curioso para usá-la ou não. Isso é algo que eu sentia muita falta de idiomas como ruby, onde você pode fazer, por exemplo, a = b || c
obter um b
ou c
mais do que um booleano 'real'. No entanto, a sintaxe que eles escolheram para o operador ternário parece um pouco contra-intuitiva para mim. Devo estar usando isso no código de produção? Definitivamente me joguei quando o vi por acidente.
fonte
Respostas:
O operador condicional ternário sem o segundo argumento é um romance pouco, mas é semelhante 1 a -coalescentes nulo operador encontrada em outros idiomas Algol derivativos como C # e Perl, e como você menciona, o
||
operador em Ruby (e JavaScript).Parece estranho no começo, mas não existe muito por aí (especialmente porque há precedentes para operadores semelhantes em outros idiomas) e pode economizar uma grande quantidade de pressionamentos de tecla. E, se o que aconteceu com o delimitador de namespace (
\
) for alguma indicação, sintaxes estranhas serão eventualmente adotadas pela comunidade PHP.Mas um dos principais problemas que os aplicativos PHP tendem a enfrentar é o (às vezes) longo tempo de atraso excruciante entre o lançamento de uma nova versão do PHP e quando os hosts começam a apoiá-lo. Isso leva a problemas nos quais você precisa ser compatível com versões anteriores do PHP, abandonando o uso de alterações de conveniência como esta.
Se isso não é uma preocupação para você, e sua equipe concorda com o uso (ou se você é um desenvolvedor solo, se estiver confortável com ele), faça o que for necessário. Como o delimitador de namespace, eu realmente acho que será realmente uma questão de quando, se não, será aceitável em todos os projetos PHP futuros.
Nota 1 : Mas não é idêntico, dado que os operadores de coalescência nula testam apenas valores não nulos (e não valores reais como PHP), e a
?:
sintaxe não suprime os avisos indefinidos, conforme mencionado nos comentários .fonte
@
para ocultar avisos sobre coisas indefinidas).Para mim, isso parece um erro no código. Parece errado e, em geral, evito usar sintaxe que parece que você cometeu um erro com o objetivo de salvar algumas teclas. Quando você (ou outra pessoa) volta a ler o código mais tarde, acho que essa linha vai enganá-lo e fazer com que você gaste algum tempo analisando o que está fazendo, pelo que é essencialmente uma operação simples.
fonte
$foo = @$bar ?: 'baz'
equivalente$foo = (@$bar ? $bar : 'baz')
. Eu concordo com seus comentários.Bem, o PHP tem um tipo booleano e o
||
operador retorna um boolen; portanto, no PHP o resultado$a || $b
é um booleano, isso é consistente&&
,&&
pois faz pouco sentido retornar um ou outro, mas faz sentido retornartrue
/false
. Ter todos os operadores booleanos retornando bools também parece bastante lógico.Além disso, isso não é invenção do PHP, mas segue C, de onde vêm muitos elementos de design do PHP "clássico". Citando o §6.5.14 da norma C99:
E, bem, quando você deve usar?: Ou não pode ser respondido da forma geral, mas lembre-se: a melhor maneira de linguagem é usar as construções que ela fornece e usar os paradigmas que ela sugere. Há pouco sentido em escrever código Java como código C, ou o contrário ;-)
fonte
Eu acho que é um operador muito útil e definitivamente deve ser usado, já que o padrão da linguagem o define explicitamente.
Observe que ele é oficialmente chamado de Operador Elvis no Grooy (por quê? Basta olhar de perto!) E foi proposto para ser introduzido no Java 7.
fonte