syntax switch - ¿A qué se llaman los operadores PHP "?" Y ":" y qué hacen?




cast int (9)

¿Cuáles son ? y : operadores en PHP?

Por ejemplo:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)

Answers

Este es el operador condicional .

$x ? $y : $z

significa "si $x es verdadero, luego use $y ; de lo contrario, use $z ".

También tiene una forma corta.

$x ?: $z

significa "si $x es verdadero, luego use $x ; de lo contrario, use $z ".

La gente te dirá eso ?: Es "el operador ternario". Esto está mal. ?: es un operador ternario, lo que significa que tiene tres operandos. La gente termina pensando que su nombre es "el operador ternario" porque a menudo es el único operador ternario que tiene un idioma determinado.



Operador condicional ? : ? : es un operador que se utiliza para verificar una condición y seleccionar un valor según el valor de la condición. Se expresa de la siguiente forma:

variable = condition ? expression1 : expression2;

Funciona de la siguiente manera ...

  1. En primer lugar, se evalúa la condición .
  2. Si la condición es verdadera, entonces se evalúa la expresión1 . Y el valor de expression1 se asigna a la variable .
  3. Si la condición es falsa, entonces se evalúa expression2 . Y el valor de expression2 se asigna a la variable.

Por ejemplo:

x = (a>b) ? 5 : 9

En esto, para x, primero se evalúa la condición (a> b). Si esta condición se vuelve verdadera, entonces x se convertirá en el valor 5 (es decir, x = 5). Pero si la condición (a> b) se vuelve falsa, entonces x alcanzará el valor 9 (es decir, x = 9).

Operador Ternario

A veces operador condicional ? : ? : también se llama operador ternario. Esto es así porque involucra tres operandos. Por ejemplo:

x ? y : z

Aquí, x, y y z son los tres operandos. Si la condición x es verdadera, entonces se asigna el valor y, de lo contrario, se asigna el valor z.


Se llama operador ternario . Si la primera expresión se evalúa como verdadera, se usa HTTP_SERVER , de lo HTTP_SERVER se elige HTTP_SERVER .

Básicamente es una declaración shorthand if , y el código anterior también se puede reescribir de la siguiente manera:

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}

Voy a escribir un poco sobre ternaries, qué son, cómo usarlos, cuándo y por qué usarlos y cuándo no usarlos.

¿Qué es un operador ternario?

¿Un ternario ? : ? : es la abreviatura de if y else . Eso es básicamente eso. Vea "Operadores Ternarios" en la mitad de esta página para obtener más información sobre una explicación oficial.

A partir de PHP 5.3 :

Desde PHP 5.3, es posible omitir la parte central del operador ternario. Expresión expr1?: Expr3 devuelve expr1 si expr1 se evalúa como VERDADERO, y expr3 en caso contrario.

A partir de PHP 7.0

PHP 7 tiene un nuevo operador de fusión nulo. Esto es lo mismo que un ternario, pero también se lo llama un " ternario isset ". Esto también permite un conjunto de ternaries encadenados que eliminan la necesidad de verificaciones isset ().

En PHP 5, si quisiera usar un ternario con una variable potencialmente inexistente, entonces tendría que ejecutar un isset () al comienzo de la declaración ternaria:

$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;

En PHP 7, ahora puede hacer esto en su lugar:

$result = $nonExistentVariable ?? ‘default’;

Sin embargo, el Operador de fusión nulo no funciona con una cadena vacía, así que tenlo en cuenta. Lo bueno de esto es que también puede encadenar a los operadores para múltiples comprobaciones de múltiples variables, proporcionando una especie de copia de seguridad dependiendo de si existe o no cada variable en la cadena:

$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;

En PHP, con sistemas donde un usuario puede iniciar sesión, no es raro que un administrador pueda suplantar a otro usuario para fines de prueba. Con el ejemplo anterior, si el usuario no se hace pasar por otro usuario, y tampoco existe un usuario conectado, entonces el usuario será un usuario invitado. Lea más si aún no entiende esto para ver qué son los ternarios y cómo se usan, y luego vuelva a este punto para ver cómo funciona el nuevo PHP

¿Cómo se usan los ternarios?

Así es como se ve una declaración if normal:

if (isset($_POST['hello']))
{
    $var = 'exists';
}
else
{
    $var = 'error';
}

Acorten eso a un ternario.

$var = isset($_POST['hello']) ? 'exists' : 'error';
                 ^            ^     ^    ^     |
                 |           then   |   else   |
                 |                  |          |
          if post isset         $var=this   $var=this

Mucho más corto, pero tal vez más difícil de leer. No solo se usan para establecer variables como $var en el ejemplo anterior, sino que también se puede hacer con echo y para verificar si una variable es falsa o no:

$isWinner = false;

// Outputs 'you lose'
echo ($isWinner) ? 'You win!' : 'You lose';

// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';

¿Por qué la gente los usa?

Creo que los ternaries son sexys. A algunos desarrolladores les gusta presumir, pero a veces los términos simplemente se ven bien en tu código, especialmente cuando se combinan con otras características como los últimos echos cortos de PHP 5.4.

<?php 
    $array = array(0 => 'orange', 1 => 'multicoloured'); 
?>

<div>
    <?php foreach ($array as $key => $value) { ?>
        <span><?=($value==='multicoloured')?'nonsense':'pointless'?></span>
    <?php } ?>
</div>

<!-- Outputs:
    <span>
        pointless
    </span>
    <span>
        nonsense
    </span> 
-->

Saliendo ligeramente del tema, cuando estás en una 'vista / plantilla' (si estás separando tus preocupaciones a través del paradigma MVC ), quieres la menor lógica del lado del servidor posible. Por lo tanto, usar ternaries y otro código de mano corta a veces es la mejor manera de avanzar. Por "otro código de mano corta", quiero decir:

if ($isWinner) :
    // Show something cool
endif;

Tenga en cuenta que personalmente no me gusta este tipo de taquigrafía si / endif sin sentido

¿Qué tan rápido es el operador ternario?

A LA GENTE LE GUSTA micro-optimizaciones. Simplemente lo hacen. Entonces, para algunos, es importante saber cuánto más rápido son las cosas como ternaries en comparación con las declaraciones if / else normales.

Al leer esta publicación , las diferencias rondan los 0.5 ms. ¡Eso es mucho!

Oh, espera, no, no lo es. Es solo un montón si haces miles y miles de ellos seguidos, repetidamente. Que no serás Así que no te preocupes por la optimización de la velocidad en absoluto, es completamente inútil aquí.

Cuándo no usar ternaries

Tu código debería ser:

  • Fácil de leer
  • Fácil de comprender
  • Fácil de modificar

Obviamente, esto está sujeto a la inteligencia de la persona y al conocimiento de codificación / nivel general de comprensión sobre tales conceptos cuando se trata de ver su código. Un simple ternario simple como los ejemplos anteriores están bien, pero algo similar a lo siguiente no es lo que deberías estar haciendo:

echo ($colour === 'red') ? "Omg we're going to die" :
     ($colour === 'blue' ? "Ah sunshine and daisies" :
     ($colour === 'green' ? "Trees are green"
     : "The bloody colour is orange, isn't it? That was pointless."));

Eso no tiene sentido por tres razones:

  • Incrustación ternaria ridículamente larga
  • Podría haber usado una declaración de switch
  • Era naranja en primer lugar

Conclusión

Ternaries realmente son simples y nada de lo que preocuparse. No considere ninguna mejora de velocidad, realmente no hará la diferencia. Úselos cuando sean simples y se vean bonitos , y siempre asegúrese de que otros puedan leer su código en el futuro. Si eso significa no ternaries, entonces no use ternaries.


Como dice John T, se llama un operador ternario y es esencialmente una versión abreviada de una instrucción if / else. Su ejemplo, como una instrucción if / else completa, leería;

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}

Esta es una forma breve de escribir if oraciones. También se usa en otros lenguajes como Java, JavaScript y otros.

Tu codigo,

$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;

puede escribirse así:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;

Esa es una declaración de una línea si:

condition ? true : false

Traducido a una declaración if normal en su caso, eso sería:

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;

Al agregar "use strict"; , los siguientes casos lanzarán un SyntaxError antes de que se ejecute el script:

  • Allanando el camino para futuras versiones de ECMAScript , utilizando una de las palabras clave recién reservadas (en previsión para ECMAScript 6 ): implements , interface , let , package , private , protected , public , static , y yield .

  • Declarando la función en bloques.

    if(a<b){ function f(){} }
    
  • Sintaxis octal

    var n = 023;
    
  • this apunta al objeto global.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Declarar dos veces el mismo nombre para un nombre de propiedad en un objeto literal

     {a: 1, b: 3, a: 7} 
    

    Este ya no es el caso en ECMAScript 6 ( error 1041128 ).

  • Declarando dos argumentos de función con la misma función de nombre

    f(a, b, b){}
    
  • Establecer un valor para una variable no declarada

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • Usando delete en un nombre de variable delete myVariable;

  • Usando eval o arguments como variable o función nombre de argumento

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

Fuentes:







php syntax conditional conditional-operator