¿Alguien puede explicar las diferencias entre el operador ternario shorthand ( ?:
) y el operador de fusión nulo ( ??
) en PHP?
¿Cuándo se comportan de manera diferente y de la misma manera (si eso sucede)?
$a ?: $b
VS.
$a ?? $b
¿Alguien puede explicar las diferencias entre el operador ternario shorthand ( ?:
) y el operador de fusión nulo ( ??
) en PHP?
¿Cuándo se comportan de manera diferente y de la misma manera (si eso sucede)?
$a ?: $b
VS.
$a ?? $b
Cuando su primer argumento es nulo, son básicamente los mismos, excepto que la fusión nula no dará salida E_NOTICE
cuando tenga una variable indefinida. Los documentos de migración de PHP 7.0 tienen esto que decir:
El operador de fusión nulo (??) se ha agregado como azúcar sintáctico para el caso común de necesitar usar un ternario junto con isset (). Devuelve su primer operando si existe y no es NULL; de lo contrario, devuelve su segundo operando.
Aquí hay un código de ejemplo para demostrar esto:
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
Las líneas que tienen el aviso son aquellas en las que estoy usando el operador ternario abreviado en lugar del operador de fusión nula. Sin embargo, incluso con el aviso, PHP devolverá la misma respuesta.
Ejecute el código: https://3v4l.org/McavC
Por supuesto, esto siempre supone que el primer argumento es null
. Una vez que ya no es nulo, termina con diferencias en que el ??
operador siempre devolverá el primer argumento, mientras que la ?:
taquigrafía solo lo haría si el primer argumento fuera verdadero, y eso se basa en cómo PHP convertiría las cosas en un booleano .
Entonces:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
entonces debería $a
ser igual false
e $b
igual a 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
o con objetos$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Ver: 3v4l.org/iCCa0Ejecuté el siguiente en modo interactivo php (
php -a
en terminal). El comentario en cada línea muestra el resultado.Entonces esta es mi interpretación:
1. El operador de fusión nula -
??
:??
es como una "puerta" que solo deja pasar NULL .NULL
.??
es lo mismo que( !isset() || is_null() )
2. El operador ternario -
?:
?:
es como una puerta que dejaanything falsy
pasar, incluyendoNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. todo lo que huele Falsyecho ($x ? $x : false)
?:
arrojará variablesPHP NOTICE
indefinidas (unset
o!isset()
)3. Entonces doctor, ¿cuándo uso
??
y?:
...?:
cuandoempty($x)
controles!empty($x) ? $x : $y
se puede acortar a$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
se puede acortar afn(($x ?: $y))
??
cuando!isset() || is_null()
cheque$object = $object ?? new objClassName();
4. Operadores de apilamiento ...
El operador ternario se puede apilar ...
Fuente y crédito para este código
Esto es básicamente una secuencia de:
El operador nulo coalese se puede apilar ...
Esta es una secuencia de:
Usando el apilamiento, puedo acortar esto:
A esto:
¿Guay, verdad? :-)
fuente
Si utiliza el operador ternario de acceso directo de esta manera, generará un aviso si
$_GET['username']
no está configurado:Entonces, en cambio, tienes que hacer algo como esto:
El operador de fusión nulo es equivalente a la declaración anterior y devolverá 'default' si
$_GET['username']
no está configurado o esnull
:Tenga en cuenta que no verifica la veracidad . Comprueba solo si está configurado y no es nulo.
También puede hacer esto, y se devolverá el primer valor definido (establecido y no
null
):Ahora que es un operador de fusión apropiado.
fuente
La principal diferencia es que
La expresión del operador ternario
expr1 ?: expr3
devuelveexpr1
si seexpr1
evalúaTRUE
pero, por otro lado, la expresión del operador de fusión nula se(expr1) ?? (expr2)
evalúaexpr1
si noexpr1
esNULL
El Operador ternario
expr1 ?: expr3
emite un aviso si el valor del lado izquierdo(expr1)
no existe pero, por otro lado, el Operador de fusión nula(expr1) ?? (expr2)
En particular, no emite un aviso si el valor del lado izquierdo(expr1)
no existe, al igual queisset()
.TernaryOperator se deja asociativo
El operador de fusión nula es asociativo correcto
Ahora vamos a explicar la diferencia entre por ejemplo:
Operador ternario
(?:)
Operador de fusión nula
(??)
Aquí está la tabla que explica la diferencia y similitud entre
'??'
y?:
fuente
Ambos se comportan de manera diferente cuando se trata del manejo dinámico de datos.
Si la variable está vacía (''), la fusión nula tratará la variable como verdadera pero el operador ternario abreviado no lo hará. Y eso es algo a tener en cuenta.
Y la salida:
Enlace: https://3v4l.org/ZBAa1
fuente
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.Ambos son shorthands para expresiones más largas.
?:
es la abreviatura de$a ? $a : $b
. Esta expresión se evaluará a $ a si $ a se evalúa como VERDADERO .??
es la abreviatura deisset($a) ? $a : $b
. Esta expresión se evaluará a $ a si $ a está establecido y no es nulo.Sus casos de uso se superponen cuando $ a no está definido o es nulo. Cuando $ a no está definido
??
, no se producirá un E_NOTICE, pero los resultados son los mismos. Cuando $ a es nulo, el resultado es el mismo.fuente
Para los principiantes:
Operador de fusión nula (??)
Todo es verdadero excepto los
null
valores y los indefinidos (variable / índice de matriz / atributos de objeto)ex:
esto es básicamente verificar que la variable (índice de matriz, atributo de objeto, etc.) exista y no exista
null
. Similar aisset
funciónTaquigrafía del operador ternario (? :)
cada falsas cosas (
false
,null
,0
, cadena vacía) se vienen como falsa, pero si se trata de un indefinido sino que también vienen como falsa, peroNotice
tiraránex
Espero que esto ayude
fuente
Desplácese hacia abajo en este enlace y vea la sección, le da un ejemplo comparativo como se ve a continuación:
Sin embargo, no se recomienda encadenar a los operadores ya que dificulta la comprensión del código al leerlo más adelante.
Esencialmente, el uso del operador coalescente hará que la comprobación automática sea nula, a diferencia del operador ternario.
fuente
a || b || c
patrón común en JS, excepto que PHP puede usarse para booleanos (false || 2
en JS es 2;false ?? 2
en PHP es falso)Las otras respuestas son profundas y dan grandes explicaciones. Para aquellos que buscan una respuesta rápida,
$a ?: 'fallback'
es$a ? $a : 'fallback'
mientras
$a ?? 'fallback'
es$a = isset($a) ? $a : 'fallback'
La principal diferencia sería cuando el operador izquierdo es:
0
,''
,false
,[]
, ...)fuente
$a =
en la expansión anterior de??
.$a ?? 'fallback'
no establece ni cambia el valor de $ a. (Simplemente devuelve un valor).Parece que hay ventajas y desventajas de usar cualquiera
??
o?:
. La ventaja de usar?:
es que evalúa falso y nulo y "" lo mismo. La desventaja es que informa un E_NOTICE si el argumento anterior es nulo. Con??
el pro es que no hay E_NOTICE, pero la desventaja es que no evalúa falso y nulo. En mi experiencia, he visto personas que comienzan a usar nulo y falso de manera intercambiable, pero luego eventualmente recurren a modificar su código para que sea consistente con el uso de nulo o falso, pero no ambos. Una alternativa es crear una condición ternaria más elaborada:(isset($something) or !$something) ? $something : $something_else
.El siguiente es un ejemplo de la diferencia de usar el
??
operador usando nulo y falso:Sin embargo, al elaborar el operador ternario, podemos hacer que una cadena "" falsa o vacía "se comporte como si fuera nula sin arrojar un aviso_e:
Personalmente, creo que sería realmente bueno si una futura revisión de PHP incluyera otro operador nuevo:
:?
que reemplazara la sintaxis anterior. es decir:// $var = $false :? "true";
esa sintaxis evaluaría nulo, falso e "" por igual y no arrojaría una E_NOTICE ...fuente
?? null ?:
cosa es increíble, gracias señor. chico inteligente.fuente
Null Coalescing operator
realiza solo dos tareas: compruebawhether the variable is set
ywhether it is null
. Eche un vistazo al siguiente ejemplo:El ejemplo de código anterior establece que
Null Coalescing operator
trata una variable no existente y una variable que se establece deNULL
la misma manera.Null Coalescing operator
es una mejora sobre elternary operator
. Eche un vistazo al siguiente fragmento de código que compara los dos:Entonces, la diferencia entre los dos es que el
Null Coalescing operator
operador está diseñado para manejar variables indefinidas mejor que elternary operator
. Mientras que,ternary operator
es una abreviatura deif-else
.Null Coalescing operator
no está destinado a reemplazarternary operator
, pero en algunos casos de uso, como en el ejemplo anterior, le permite escribir código limpio con menos problemas.Créditos: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
fuente
isset($_POST['fullname'])
ya comprueba losNULL
valores, por lo que&& !is_null($_POST['fullname'])
el primer ejemplo es redundante de todos modosCuando utilice las superglobales como $ _GET o $ _REQUEST, debe tener en cuenta que podrían ser una cadena vacía. En este caso especial este ejemplo
fallará porque el valor de $ username ahora es una cadena vacía.
Por lo tanto, cuando use $ _GET o incluso $ _REQUEST, debe usar el operador ternario como este:
Ahora el valor de $ username es 'nobody' como se esperaba.
fuente