Recientemente estaba revisando parte de mi código y noté que en un ataque de distracción, había dejado una estructura como la siguiente:
$guid = empty($subscription->guid) ? : $subscription->guid;
Ahora, esto no estaba haciendo lo que se supone que debe hacer y está mal , pero como esa propiedad siempre está configurada ahora funcionaba bien, y no hay un error de sintaxis desde 5.3 debido al siguiente cambio :
Desde PHP 5.3, es posible omitir la parte media del operador ternario. Expresión expr1?: Expr3 devuelve expr1 si expr1 se evalúa como VERDADERO y expr3 de lo contrario.
No estaba al tanto de este cambio, y ahora tengo curiosidad por saber si debería usarlo o no. Esto es algo que echaba mucho de menos en idiomas como ruby, donde puedes hacer, por ejemplo, a = b || c
obtener uno b
o c
más que un booleano 'real'. Sin embargo, la sintaxis que han elegido para el operador ternario me parece un poco contra intuitiva. ¿Debo usar esto en el código de producción? Definitivamente me arrojé cuando lo vi por accidente.
fuente
Respuestas:
El operador condicional ternario sin el segundo argumento es un poco novedoso, pero es similar 1 al operador de fusión nula que se encuentra en otros lenguajes derivados de Algol como C # y Perl, y como usted menciona, el
||
operador en Ruby (y JavaScript).Al principio parece extraño, pero no está demasiado disponible (especialmente porque hay precedentes de operadores similares en otros idiomas) y puede ahorrar una gran cantidad de pulsaciones de teclas. Y, si lo que sucedió con el delimitador de espacio de nombres (
\
) es una indicación, la comunidad PHP eventualmente adoptará sintaxis extrañas.Pero uno de los principales problemas a los que tienden a enfrentarse las aplicaciones PHP es el (a veces) tiempo de demora insoportablemente largo entre el lanzamiento de una nueva versión de PHP y cuando los hosts comienzan a admitirlo. Esto lleva a problemas en los que debe ser compatible con versiones anteriores de PHP, dejando de usar cambios de conveniencia como este.
Si eso no es una preocupación para usted, y su equipo está de acuerdo en su uso (o si es un desarrollador en solitario, si se siente cómodo con él), hágalo. Al igual que el delimitador de espacio de nombres, realmente creo que realmente será una cuestión de cuándo, no si, será aceptable en todos los futuros proyectos PHP.
Nota 1 : Pero no es idéntico, dado que los operadores de fusión nula solo prueban valores no nulos (y no valores verdaderos como PHP), y la
?:
sintaxis no suprime los avisos indefinidos como mencionó en los comentarios .fuente
@
para ocultar avisos sobre cosas indefinidas).Para mí, eso parece un error en el código. Parece incorrecto y, en general, evito usar la sintaxis que parece que ha cometido un error por el simple hecho de guardar algunas teclas. Cuando usted (u otra persona) vuelva a leer el código más tarde, creo que esa línea lo hará tropezar y hará que tenga que pasar un tiempo analizando lo que está haciendo, lo que es esencialmente una operación simple.
fuente
$foo = @$bar ?: 'baz'
equivalente a$foo = (@$bar ? $bar : 'baz')
. Sin embargo, estoy de acuerdo con sus comentarios.Bueno, PHP tiene un tipo booleano y el
||
operador devuelve un booleano, por lo que en PHP el resultado de$a || $b
es un booleano, esto es consistente&&
ya&&
que tiene poco sentido devolver uno u otro pero tiene sentido devolvertrue
/false
. Hacer que todos los operadores booleanos devuelvan bools también suena bastante lógico.Además, esto no es una invención de PHP, sino después de C, de donde provienen muchos elementos de diseño de PHP "clásico". Citando del §6.5.14 de la norma C99:
Y, bueno, ¿cuándo debe usar?: O no, no se puede responder en forma general, pero tenga en cuenta: La mejor forma de lenguaje es usar las construcciones que proporciona y usar los paradigmas que sugiere. Tiene poco sentido escribir código Java como el código C, o al revés ;-)
fuente
Creo que es un operador muy útil y definitivamente debería usarse ya que el estándar del lenguaje lo define explícitamente.
Tenga en cuenta que oficialmente se llama Elvis Operator en Grooy (¿por qué? ¡Mírelo de cerca!), Y se propuso su introducción en Java 7.
fuente