if ('constante' == $ variável) vs. if ($ variável == 'constante')

46

Ultimamente, tenho trabalhado muito em PHP e especificamente na estrutura do WordPress. Estou percebendo muito código na forma de:

if ( 1 == $options['postlink'] )

Onde eu esperaria ver:

if ( $options['postlink'] == 1 )

Esta é uma convenção encontrada em certas linguagens / frameworks? Existe alguma razão pela qual a primeira abordagem é preferível a esta última (de uma perspectiva de processamento, ou uma perspectiva de análise ou mesmo uma perspectiva humana?)

Ou é apenas uma questão de gosto? Eu sempre achei melhor ao realizar um teste, que o item variável que está sendo testado contra alguma constante está à esquerda. Parece mapear melhor a maneira como faríamos a pergunta em linguagem natural: "se o bolo é chocolate" em vez de "se o chocolate é o bolo".

    
por Tom Auger 06.05.2011 / 00:43
fonte

3 respostas

79

O principal motivo para fazer isso (o chamado "condicional Yoda") é evitar acidentes nos quais você acidentalmente usa um operador de atribuição ( = ) em vez do operador de comparação de igualdade ( == ).

Ou seja, se você cometeu o erro de fazer:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

A declaração será avaliada como true (ou, no caso de alguns idiomas - como PHP - um valor geral) e você terá um erro difícil de encontrar.

Mas se você fez:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

Você receberá um erro fatal porque não pode atribuir $foo a um número inteiro.

Mas, como você observou, reverter a ordem geralmente torna as coisas menos legíveis. Assim, muitos padrões de codificação (mas não todos, incluindo o WordPress ) sugerem ou exigem $foo == 1 apesar dos benefícios da busca de bugs de 1 == $foo .

Geralmente, meu conselho é seguir qualquer padrão de codificação estabelecido, se houver um: para o WordPress, isso significa usar condicionais Yoda.

Quando não há, e é impossível estabelecer um através do consenso com seus colegas, é a escolha do negociante.

    
por 06.05.2011 / 00:48
fonte
13

É um mecanismo de codificação defensivo destinado a impedir o uso acidental do operador de atribuição.

Considere um uso incorreto / erro do operador de atribuição no lugar do operador de igualdade

if ( $options['postlink'] = 1  )

A condicional acima sempre retornará verdadeira, mas provavelmente não é o que o programador original tinha em mente. Considere, no seu lugar, isso

if( 1 = $options['postlink'])

Aqui, o PHP (e a maioria das outras linguagens) se recusariam a executar, já que é impossível atribuir qualquer coisa ao valor fixo de 1 . Ao codificar todas as declarações condicionais dessa maneira, você garante automaticamente que não haja uso acidental de um operador de atribuição em uma condição.

    
por 06.05.2011 / 00:50
fonte
8

Eu gosto de usar essa convenção em java para remover a possibilidade de uma exceção de ponteiro nulo. Então, algo assim não causará nenhum problema ou precisará de qualquer código extra:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}
    
por 06.05.2011 / 01:12
fonte