Qual é a diferença (se houver) entre (null! = $ Object) e ($ object! = Null) ao usar o PHP?


8

Estou acostumado a Java e, portanto, sempre acho que as condições são interpretadas da esquerda para a direita, ou seja, há uma diferença vital null != $obje$obj != null

Agora, esse não parece ser o caso do PHP.

Posso fazer algo errado no PHP quando começo sempre nullno lado esquerdo? Posso manter meu comportamento em Java ou preciso me treinar para fazer outra coisa ao lidar com as condições do PHP?


5
Não há diferença, mas você deve evitar as condições de yoda , é estranho você achar que elas são padrão em Java ou que há algum ponto nelas, em termos de interpretação.
yannis

Mas o que seria um argumento para sempre começar com nulo? Causa null = $ a faz com que o PHP engasgue onde $ a = null passaria sem ser detectado.
Assistente da Tech

null = $aé tarefa e null != $aé comparação, você quis dizer null == $a? null = $anão funcionará, e sim em tarefas, a ordem de interpretação é significativa - e também não funcionaria em Java. Estamos falando de condicionais ou atribuição?
yannis

lol ... aehm ... ok. Desculpe, eu não estava me esclarecendo o suficiente ... Vamos supor que você cometa um erro ao escrever uma condição e criar uma expressão yoda. (como você disse) E você produz uma linha de código como: ($ a = null). Ele passará despercebido porque você produziu uma condição legal. Agora, se eu disser à minha equipe que SEMPRE inicie uma condição com nulo (se uma verificação nula for usada) no lado esquerdo da mão, isso poderá ajudar a evitar esse tipo de erro. Na verdade ... Acabei de responder minha própria pergunta graças ao seu feedback. :-)
Wizard Of Tech

1
De que maneira ele difere do Java?
Phant0m

Respostas:


4
  • Não há diferença (técnica) - nem em Java, que eu saiba.
  • No PHP, não use nenhum deles.

Eu recomendo que você sempre use os estritos operadores de comparação ===e, !==se possível. Você saberá quando realmente precisa de operadores de comparação soltos.

Mal-entendidos

Eu acredito que você pode estar confuso sobre algumas coisas:

  • operadores de curto-circuito
  • ordem de avaliação
  • operador precedente

Acabei de descobrir que o manual do PHP diz: "O PHP verifica cada condição na ordem da esquerda para a direita"

Não,

  • o PHP Manual se não dizer que, é um comentário.
  • PHP não faz isso.

O PHP avalia as condições da esquerda para a direita, mas para quando o resultado é conhecido:

expr1 && expr2

Se expr1avalia que false, expr2se não ser avaliada. Isso é chamado de curto-circuito e não parece muito bem documentado - não consegui encontrar nenhuma outra nota oficial sobre o assunto, exceto pelo comentário no Exemplo # 1. É um recurso bem conhecido , no entanto.

Falácias

Estou acostumado a Java e, portanto, sempre acho que as condições são interpretadas da esquerda para a direita, ou seja, há uma diferença vital em null! = $ Obj e $ obj! = Null


O PHP verifica cada condição na ordem da esquerda para a direita.
Ergo: A mesma "melhor prática" pode ser aplicada

Ergo: nada - não sequitur. A conclusão não segue da premissa. Usando constant == $variableou $variable == constantnão está conectado a um curto-circuito , ordem de avaliação ou precedência do operador .

Comportamento indefinido

Ambos os operandos de !=são sempre avaliados. No caso do PHP, a ordem de avaliação (que é irrelevante aqui) é na verdade não especificada (como ausente na documentação).


Agradecemos pelo seu esclarecimento sobre o assunto. Embora eu não goste do seu tom em relação ao meu conhecimento de Java. (Consulte a Seção 15.7 da especificação da linguagem Java) Vamos resumir. A ordem da avaliação não é especificada no PHP e, portanto, você não pode confiar nela! O segundo nunca usa! = Ou == usuário === ou! ==.
Assistente da Tech

@anann Não sei onde você acha que estou "avaliando" seu conhecimento de Java. A única coisa que disse foi: "nor is there in Java to my knowledge."li a seção 15.7, mas não é importante aqui . Desde que você não tenha efeitos colaterais em sua comparação (como no exemplo), a ordem da avaliação não importa. Qual parte você considera ofensiva?
Phant0m

0

Em relação ao seu caso específico, outra abordagem seria usar a função php integrada is_null. Então você terminaria com is_null ($ mixedValue), que faria todo o trabalho para você e faria a comparação de tipos e tudo mais.


-1

@ phant0m: OK, ponto escolhido ... NUNCA USE! = ou == sempre use! === e === quando você codifica com PHP. Portanto, essa pergunta estava errada no início e não há práticas recomendadas com NULL nos dois lados da condição quando se trata de PHP.


5
É uma troca. Você sacrifica a legibilidade por segurança ( $a == NULLcodifica intenção, NULL == $aadiciona uma proteção), e essa segurança não é tão forte assim porque você ainda depende de trabalho manual (hábitos) em vez de verificações automatizadas invencíveis. Não acho que a troca valha a pena, mas isso é uma questão de opinião pessoal.
tdammers

1
Ah, e eu sempre assumi que 'condição yoda' se referia a reverter o sujeito e o objeto em suas condições, de modo que eles leiam "se você tiver vinte e três maçãs" ( 23 == num_apples) em vez de "se você tiver vinte e três maçãs" ( num_apples == 23) .
precisa saber é o seguinte

2
Você parecia estar confuso sobre o que é uma "declaração Yoda". É "Yoda" quando você coloca o NULL (ou a parte constante da expressão) à esquerda: gordienoye.ca/2012/02/07/when-yoda-writes-if-statements
Martin York

2
Além disso, o php avisa se você fizer isso: stackoverflow.com/q/718415/14065, você deve verificar seus logs de erros em busca de avisos e erros e corrigi-los todos. O estilo Yoda era a moda dos anos 90. A alegação era que resolveu esse grupo de problemas. Na realidade, isso dificulta a leitura do código e os compiladores (intérpretes) da maioria dos idiomas já o alertam sobre o problema. Portanto, não há benefício real em usá-los (supondo que você garanta que seu código seja executado sem aviso (o que você deve fazer de qualquer maneira)). Uma solução melhor é não fazer a atribuição em condicionais (portanto, execute sem aviso).
Martin York

@tdammers Legibilidade é opinião, portanto, para aqueles de nós que não têm problemas com eles, "condicionais yoda" são o que costumamos adotar. Meus olhos são atraídos primeiro pelo condicional, então a ordem não ajuda ou prejudica. Mesmo para >e <, vou ler mais como "Se esse for maior", depois lerei o que deve ser maior para a condicionalidade passar, depois para o outro lado.
Izkata
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.