¿Cuál es la diferencia (si la hay) entre (nulo! = $ Objeto) y ($ objeto! = Nulo) cuando se usa PHP?

8

Estoy acostumbrado a Java y por lo tanto, siempre que las condiciones se interpretan de izquierda a derecha, es decir, hay una diferencia fundamental en null != $objy$obj != null

Ahora parece que este no es el caso con PHP.

¿Puedo hacer algo mal en PHP cuando siempre comienzo con nullel lado izquierdo? ¿Puedo mantener mi comportamiento de Java o necesito entrenarme para hacer algo más cuando trato con condiciones PHP?

Mago de la tecnología
fuente
55
No hay diferencia, pero debe evitar las condiciones de yoda , es extraño que piense que son estándar en Java o que hay algún punto en ellas, en cuanto a interpretación.
Yannis
Pero, ¿sería un argumento para comenzar siempre con nulo? Causa null = $ a hace que PHP se ahogue donde $ a = null pasaría sin ser detectado.
Wizard Of Tech
null = $aes asignación y null != $aes comparación, ¿querías decir null == $a? null = $ano funcionará, y sí, el orden de interpretación de las tareas es significativo, y tampoco funcionaría en Java. ¿Estamos hablando de condicionales o asignaciones?
Yannis
jajaja ... aehm ... ok. Lo siento, no me estaba aclarando lo suficiente ... Supongamos que cometes un error al escribir una condición y crear una expresión yoda. (como dijiste) Y generas una línea de código como: ($ a = null). Pasará desapercibido porque usted produjo una condición legal. Ahora, si le digo a mi equipo que SIEMPRE comience una condición con nulo (si se usa una verificación nula) en el LADO IZQUIERDO DE LA MANO, podría ayudar a evitar este tipo de error. En realidad ... acabo de responder mi propia pregunta gracias a sus comentarios. :-)
Wizard Of Tech
1
¿En qué se diferencia de Java?
phant0m

Respuestas:

4
  • No hay diferencia (técnica), ni hay en Java que yo sepa.
  • En PHP, no use ninguno de estos.

Le recomiendo que use siempre los operadores de comparación estrictos ===y, !==si es posible. Sabrá cuándo realmente necesita operadores de comparación sueltos.

Malentendidos

Creo que puede estar confundido acerca de un par de cosas:

  • operadores de cortocircuito
  • orden de evaluación
  • precedencia del operador

Acabo de encontrar que el manual de PHP dice: "PHP verifica cada condición en orden de izquierda a derecha"

No,

  • PHP Manual no no dicen eso, es un comentario.
  • PHP no hace eso.

PHP evalúa las condiciones de izquierda a derecha, pero se detiene una vez que se conoce el resultado:

expr1 && expr2

Si expr1a evalúa false, expr2serán no ser evaluados. Esto se llama cortocircuito y no parece estar muy bien documentado : no pude encontrar ninguna otra nota oficial sobre el asunto, excepto el comentario en el Ejemplo # 1. Sin embargo, es una característica bien conocida .

Falacias

Estoy acostumbrado a Java y, por lo tanto, siempre pienso que las condiciones se interpretan de izquierda a derecha, es decir, hay una diferencia vital en nulo! = $ Obj y $ obj! = Nulo


PHP verifica cada condición en orden de izquierda a derecha
Ergo: se puede aplicar la misma "mejor práctica"

Ergo: nada , no sequitur. La conclusión no se sigue de la premisa. Usar constant == $variableo $variable == constantno está conectado a cortocircuito , orden de evaluación o precedencia del operador .

Comportamiento indefinido

Ambos operandos de !=son siempre evaluados. En el caso de PHP, el orden de evaluación (que aquí es irrelevante) en realidad no está especificado (como ausente de la documentación).

phant0m
fuente
Gracias por su aclaración sobre el tema. Aunque no me gusta tu tono con respecto a mi conocimiento de Java. (Consulte la Sección 15.7 de la Especificación del lenguaje Java) Vamos a resumirlo. El orden de evaluación no está especificado en PHP y, por lo tanto, no puede confiar en él. 2nd nunca use! = O == user === o! ==.
Wizard Of Tech
@anann No estoy seguro de dónde crees que estoy "calificando" tu conocimiento de Java. Lo único que dije es: "nor is there in Java to my knowledge."he leído la sección 15.7, pero no es importante aquí . Mientras no tenga efectos secundarios en su comparación (como en su ejemplo), el orden de evaluación no importa. ¿Qué parte encuentras ofensiva?
phant0m
0

Con respecto a su caso particular, otro enfoque sería utilizar la función php integrada is_null. Por lo tanto, terminaría con is_null ($ mixedValue) que haría todo el trabajo por usted y haría la comparación de tipos y todo lo demás.

Vadim
fuente
-1

@ phant0m: OK punto tomado ... ¡NUNCA USE! = o == siempre use! === y === cuando codifica con PHP. Por lo tanto, esta pregunta era incorrecta al principio, y no hay una mejor práctica con NULL en ambos lados de la condición cuando se trata de PHP.

Mago de la tecnología
fuente
55
Es una compensación. Sacrifica la legibilidad por seguridad ( $a == NULLcodifica la intención, NULL == $aagrega una salvaguarda), y esta seguridad ni siquiera es tan fuerte porque todavía depende del trabajo manual (hábitos) en lugar de verificaciones automáticas imposibles de verificar. No creo que la compensación valga la pena, pero eso es una cuestión de opinión personal.
tdammers
1
Ah, y siempre asumí que 'yoda condición' se refería a revertir el sujeto y el objeto en sus condiciones, para que leyeran "si tienes veintitrés manzanas" ( 23 == num_apples) en lugar de "si tienes veintitrés manzanas" ( num_apples == 23) .
tdammers
2
Parecía estar confundido sobre lo que es una "declaración Yoda". Es "Yoda" cuando pones el NULL (o la parte constante de la expresión) a la izquierda: gordienoye.ca/2012/02/07/when-yoda-writes-if-statements
Martin York
2
También php te advierte si haces esto: stackoverflow.com/q/718415/14065 deberías verificar tus registros de errores en busca de advertencias y errores y corregirlos a todos. El estilo de Yoda estaba de moda en los años 90. La afirmación era que resolvió este grupo de problemas. En realidad, hace que el código sea más difícil de leer y los compiladores (intérpretes) para la mayoría de los idiomas ya le advierten sobre el problema. Por lo tanto, no hay ningún beneficio real al usarlos (suponiendo que se asegure de que su código se ejecute sin advertencia (lo que debe hacer de todos modos)). Una mejor solución es no hacer asignaciones condicionales (por lo tanto, ejecutar sin advertencia).
Martin York
@tdammers La legibilidad es una opinión, por lo que para aquellos de nosotros que no tenemos ningún problema con ellos, los "yoda-condicionales" son lo que solemos hacer por defecto. Mis ojos se sienten atraídos por el condicional primero, por lo que el orden no ayuda ni perjudica. Incluso para >y <, lo leeré más como "Si ese es más grande", entonces lea el que debería ser más grande para que pase el condicional, luego el otro lado.
Izkata