Usar el operador ternario de PHP con solo dos argumentos

9

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 || cobtener uno bo cmá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.

Matthew Scharley
fuente
Debe usar un operador de fusión nulo para ese Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Respuestas:

7

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 .

Comunidad
fuente
Por el momento, mi 'equipo' consiste exclusivamente en mí. El alojamiento no es un problema, ya que generalmente alojamos el 98% de los sitios que creamos, y alojamos en la parte superior de 5.3.6. Me doy cuenta de que la funcionalidad en sí no es tan inusual, solo la sintaxis, que fue la raíz de mi pregunta. También está el problema de que no actúa como un operador de fusión nula sin más sintaxis ( @para ocultar avisos sobre cosas indefinidas).
Matthew Scharley
3
@MatthewScharley Si la debacle del delimitador del espacio de nombres (\) es una indicación, la sintaxis extraña no es una barrera para la adopción generalizada en PHP. Realmente se reduce a cuándo, no si, debes comenzar a usarlo.
3

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.

MattBelanger
fuente
El ejemplo dado es incorrecto . Un uso correcto de la funcionalidad según lo previsto sería $foo = @$bar ?: 'baz'equivalente a $foo = (@$bar ? $bar : 'baz'). Sin embargo, estoy de acuerdo con sus comentarios.
Matthew Scharley
1

Bueno, PHP tiene un tipo booleano y el ||operador devuelve un booleano, por lo que en PHP el resultado de $a || $bes un booleano, esto es consistente &&ya &&que tiene poco sentido devolver uno u otro pero tiene sentido devolver true/ 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:

El || el operador producirá 1 si alguno de sus operandos se compara desigual a 0; de lo contrario, produce 0. El resultado tiene el tipo int.

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 ;-)

johannes
fuente
0

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.

Michael Borgwardt
fuente