2011-08-31 23 views
9

Duplicar posible:
Why do some experienced programmers write expressions this way?¿Hay alguna ventaja de usar null primero en PHP?

Tengo curiosidad acerca de esto: en la mayoría de los proyectos de código abierto/marcos que he estudiado, he visto a menudo código como este ...

<?php 

if (null === self::$_instance) { 
    self::$_instance = new self(); 
} 

En particular esta línea ...

if (null === self::$_instance) { 

¿Por qué utilizar null en el primer argumento de la instrucción if en lugar de al revés? ...

if (self::$_instance === null) { 

realizo probablemente no hay aumento de rendimiento ni nada de eso. ¿Es solo una preferencia o es algún tipo de estándar de codificación que he pasado por alto?

+2

Personalmente, me inclino a decir que todos deberían ser 'if (! Self :: $ _ instance)' – cwallenpoole

+0

Si esto no es un duplicado, me comeré mi teclado –

+5

Ese estilo de notación se conoce como "expresiones yoda" "o" condiciones yoda ". – mario

Respuesta

12

que le impide asignar un valor accidentalmente a una variable, especialmente cuando sólo se utilizan la comparación de tipo flojo (==):

if (self::$_instance = NULL) { … } // WHOOPS!, self::$_instance is now NULL 

Este estilo de condiciones a menudo se llama yoda conditions. Rendimiento sabio no hay diferencia, ambas declaraciones son equivalentes.

0

No es particular, a null - He visto muchos programadores prefieren escribir sus expresiones de este modo redonda:

if(8 == 4 * 2) { 

Es sólo una preferencia que algunas personas piensan que es más claro.

+0

Eso no es una condición, es una tarea, que fracasará;) Sin embargo, usted simplemente escribió un tipeo. – Layke

+0

este es un error de tiempo de compilación, no se puede asignar un valor a 8 – knittl

+2

@Layke: que es exactamente la razón por la que uno lo escribiría al revés: los errores tipográficos se convierten en errores de compilación – knittl

6

Esto es principalmente para evitar la asignación accidental:

if (self::$_instance = null) ... //oops! 
4

No hay diferencia significativa del rendimiento. El beneficio habitual de escribir expresiones de esta manera es la programación defensiva. Queremos evitar el uso accidental de una asignación en lugar de comparación de igualdad:

if (self::$_instance = null) { ... 

¡Vaya!

+0

Guau, tres respuestas simultáneas virtualmente idénticas. Alguien se debe una Coca. –

3

Es para ayudarlo a obtener el código correcto.

Si hace esto, su código funcionará, pero el efecto será muy lejos de lo que quiere:

if (self::$instance = null) { 

El condicional fallará siempre (porque el operador = devuelve el conjunto de valores, y es falso) pero self::$instance ahora se establecerá en null. Esto no es lo que quieres

Si hace esto:

if (null = self::$instance) { 

su código dejará de funcionar, porque no se puede utilizar null (o cualquier literal como una cadena o un número entero) en la mano del lado izquierdo un trabajo. Solo las variables pueden ser el lado izquierdo del operador =.

Así que si escribes mal el == como , obtienes un error de análisis y tu código no funciona por completo. Esto es preferible a un error desconcertante y difícil de rastrear.

Cuestiones relacionadas