Usando o operador ternário do PHP com apenas dois argumentos

9

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 || cobter um bou cmais 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.

Matthew Scharley
fonte
Você deve usar nulo coalescentes operador para que Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Respostas:

7

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 .

Comunidade
fonte
No momento, minha 'equipe' consiste apenas em mim. Hospedar não é um problema, pois geralmente hospedamos 98% dos sites que construímos, além de 5.3.6. Percebo que a funcionalidade em si não é tão incomum, apenas a sintaxe, que foi a raiz da minha pergunta. Há também o problema em que ele não age como um operador de coalescência nula sem mais sintaxe ( @para ocultar avisos sobre coisas indefinidas).
Matthew Scharley
3
@MatthewScharley Se o debacle do delimitador de namespace (\) for alguma indicação, a sintaxe estranha não será uma barreira à adoção generalizada no PHP. Realmente se resume a quando, e não se, você deve começar a usá-lo.
3

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.

MattBelanger
fonte
O exemplo dado está errado . Um uso correto da funcionalidade, como pretendido, seria $foo = @$bar ?: 'baz'equivalente $foo = (@$bar ? $bar : 'baz'). Eu concordo com seus comentários.
Matthew Scharley
1

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 retornar true/ 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:

O || o operador deve produzir 1 se um de seus operandos comparar desigualmente com 0; caso contrário, produz 0. O resultado tem o tipo int.

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 ;-)

johannes
fonte
0

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.

Michael Borgwardt
fonte