operador ternário e concatenação peculiaridade?
-
19-09-2019 - |
Pergunta
Oi eu só quero saber por que isso rendimentos código (pelo menos para mim) um resultado incorreto.
Bem, provavelmente eu estou em falta aqui
$description = 'Paper: ' . ($paperType == 'bond') ? 'Bond' : 'Other';
Eu estava adivinhando que, se PaperType é igual a 'Bond', em seguida, a descrição é 'Papel: Bond' e se PaperType não é igual a 'Bond', em seguida, a descrição é 'Papel: Outro'.
Mas quando eu executar esse código, os resultados são descrição é 'Bond' ou 'Outro' e me deixou perguntando onde a string 'Papel:' fui ???
Solução
$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');
Tente adicionar parênteses para que a string é concatenado com uma corda na ordem correta.
Outras dicas
Ela está relacionada com a precedência do operador. Você tem que fazer o seguinte:
$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
Eu acho que todo mundo deu a solução, eu gostaria de contribuir a razão para o resultado inesperado.
Antes de tudo aqui você pode conferir a origem, e como os operadores são avaliados (esquerda, direita, associativa, etc).
http://php.net/manual/fa/language.operators .precedence.php
Agora, se analisarmos sua sentença.
$ paperType = 'bond';
$ description = 'Paper:'. ($ paperType == 'bond')? 'Bond': 'Other';
1) Revisamos a tabela e achar que os parênteses são avaliadas primeiro, então o '' (Concatenação) é avaliada e no final o operador ternário, portanto, poderíamos associar isso da seguinte forma '?':
// evaluate the parenthesis ... ($ paperType == 'bond')
$ description = ('Paper:'. 1)? 'Bond': 'Other';
//result
$ description = 'Paper: 1'? 'Bond': 'Other';
2) Temos agora o operador ternário, sabemos que uma string é avaliada "true"
// documentação php Quando convertendo para booleano, os seguintes valores são considerados FALSE:
... a cadeia vazia, e a string "0"
$ description = true? 'Bond': 'Other';
3) Finalmente
$ description = 'bond';
Espero ter esclarecido a questão. Saudações.