if ('constant' == $ variable) vs. if ($ variable == 'constant')

46

Últimamente, he estado trabajando mucho en PHP y específicamente en el marco de WordPress. Estoy notando una gran cantidad de código en la forma de:

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

Donde habría esperado ver:

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

¿Se trata de una convención que se encuentra en ciertos lenguajes / marcos? ¿Hay alguna razón por la que el primer enfoque sea preferible al segundo (desde una perspectiva de procesamiento, una perspectiva de análisis o incluso una perspectiva humana)?

¿O es simplemente una cuestión de gusto? Siempre he pensado que es mejor al realizar una prueba, que el elemento variable que se está probando contra alguna constante está a la izquierda. Parece que se relaciona mejor con la forma en que haríamos la pregunta en lenguaje natural: "si el pastel es chocolate" en lugar de "si el chocolate es el pastel".

    
pregunta Tom Auger 06.05.2011 - 00:43

3 respuestas

79

La razón principal para hacer esto (lo que se denomina "condicional de Yoda") es evitar accidentes por los que se usa accidentalmente un operador de asignación ( = ) en lugar del operador de comparación igual ( == ).

Es decir, si cometió el error de cometer:

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

La declaración se evaluará como true (o, en el caso de algunos idiomas, como PHP, un valor real) y tendrá un error difícil de encontrar.

Pero si lo hiciste:

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

Recibirá un error fatal porque no puede asignar $foo a un entero.

Pero como usted señaló, revertir el orden generalmente hace que las cosas sean menos legibles. Por lo tanto, muchos estándares de codificación (pero no todos, incluyendo WordPress ) sugieren o requieren $foo == 1 a pesar de los beneficios de la caza de errores de 1 == $foo .

En general, mi consejo es que sigas el estándar de codificación establecido, si existe, para WordPress, eso significa usar condicionales de Yoda.

Cuando no lo hay, y es imposible establecer uno a través del consenso con sus compañeros, es decisión del distribuidor.

    
respondido por el user8 06.05.2011 - 00:48
13

Es un mecanismo de codificación defensivo destinado a evitar un uso accidental del operador de asignación.

Considere un uso indebido / error del operador de asignación en lugar del operador de igualdad

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

El condicional anterior siempre devolverá verdadero, pero probablemente no sea eso lo que el programador original tenía en mente. Considera, en su lugar, esto

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

Aquí, PHP (y la mayoría de los otros idiomas) se negaría a ejecutarse, ya que es imposible asignar nada al valor fijo de 1 . Al codificar todas las declaraciones condicionales de esta manera, automáticamente garantiza que no se utilice accidentalmente un operador de asignación en un condicional.

    
respondido por el Alan Storm 06.05.2011 - 00:50
8

Me gusta usar esa convención en java para eliminar la posibilidad de una excepción de puntero nulo. Así que algo como esto no le causará ningún problema ni necesitará ningún código adicional:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}
    
respondido por el Ben Newman 06.05.2011 - 01:12

Lea otras preguntas en las etiquetas