ternary-operator |= - El operador de unión nulo de C#(??)en PHP




que significa (6)

¿Hay un operador ternario o similar en PHP que actúa como ?? De c#?

?? en C # es limpio y más corto, pero en PHP tienes que hacer algo como:

// This is absolutely okay except that $_REQUEST['test'] is kind of redundant.
echo isset($_REQUEST['test'])? $_REQUEST['test'] : 'hi';

// This is perfect! Shorter and cleaner, but only in this situation.
echo null? : 'replacement if empty';

// This line gives error when $_REQUEST['test'] is NOT set.
echo $_REQUEST['test']?: 'hi';

Answers

El wiki.php.net/rfc/isset_ternary , ( ?? ) ha sido aceptado e implementado en PHP 7 . Se diferencia del operador ternario corto ( ?: ?? eso ?? suprimirá la E_NOTICE que de lo contrario ocurriría al intentar acceder a una matriz donde no tiene una clave. El primer ejemplo en el RFC da:

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

Tenga en cuenta que el ?? El operador no requiere la aplicación manual de isset para evitar la E_NOTICE .


No existe un operador idéntico a partir de PHP 5.6, pero puede realizar una función que se comporte de manera similar.

/**
 * Returns the first entry that passes an isset() test.
 *
 * Each entry can either be a single value: $value, or an array-key pair:
 * $array, $key.  If all entries fail isset(), or no entries are passed,
 * then first() will return null.
 *
 * $array must be an array that passes isset() on its own, or it will be
 * treated as a standalone $value.  $key must be a valid array key, or
 * both $array and $key will be treated as standalone $value entries. To
 * be considered a valid key, $key must pass:
 *
 *     is_null($key) || is_string($key) || is_int($key) || is_float($key)
 *         || is_bool($key)
 *
 * If $value is an array, it must be the last entry, the following entry
 * must be a valid array-key pair, or the following entry's $value must
 * not be a valid $key.  Otherwise, $value and the immediately following
 * $value will be treated as an array-key pair's $array and $key,
 * respectfully.  See above for $key validity tests.
 */
function first(/* [(array $array, $key) | $value]... */)
{
    $count = func_num_args();

    for ($i = 0; $i < $count - 1; $i++)
    {
        $arg = func_get_arg($i);

        if (!isset($arg))
        {
            continue;
        }

        if (is_array($arg))
        {
            $key = func_get_arg($i + 1);

            if (is_null($key) || is_string($key) || is_int($key) || is_float($key) || is_bool($key))
            {
                if (isset($arg[$key]))
                {
                    return $arg[$key];
                }

                $i++;
                continue;
            }
        }

        return $arg;
    }

    if ($i < $count)
    {
        return func_get_arg($i);
    }

    return null;
}

Uso:

$option = first($option_override, $_REQUEST, 'option', $_SESSION, 'option', false);

Esto intentaría con cada variable hasta que encuentre una que satisfaga a isset() :

  1. $option_override
  2. $_REQUEST['option']
  3. $_SESSION['option']
  4. false

Si 4 no estuvieran allí, por defecto sería null .

Nota: hay una implementación más sencilla que utiliza referencias, pero tiene el efecto secundario de 3v4l.org/9vmFR . Esto puede ser problemático cuando el tamaño o la veracidad de una matriz son importantes.


PHP 7 agrega el operador de unión nula :

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

También puede buscar una forma breve de escribir el operador ternario de php ?: (Solo php = = 5.3)

// Example usage for: Short Ternary Operator
$action = $_POST['action'] ?: 'default';

// The above is identical to
$action = $_POST['action'] ? $_POST['action'] : 'default';

Y su comparación con C # no es justa. "en PHP tiene que hacer algo como": en C # también tendrá un error de tiempo de ejecución si intenta acceder a un elemento de matriz / diccionario que no existe.


?? Es binario en C #, no ternario. Y no tiene equivalencia en PHP antes de PHP 7.


Antes de PHP 7, no hay. Si necesita involucrar a isset , el patrón a usar es isset($var) ? $var : null isset($var) ? $var : null . No hay operador ?: Que incluye las características de isset .


Operador bitwise

Que es un poco Un bit es una representación de 1 o 0. Básicamente OFF (0) y ON (1)

¿Qué es un byte? Un byte se compone de 8 bits y el valor más alto de un byte es 255, lo que significaría que cada bit se establece. Veremos por qué el valor máximo de un byte es 255.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------

Esta representación de 1 byte.

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255 (1 byte)

Algunos ejemplos para una mejor comprensión.

El operador "AND": &

$a =  9;
$b = 10;
echo $a & $b;

Esto daría como resultado el número 8. ¿Por qué? Bueno, veamos usando nuestro ejemplo de mesa.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      &     |   0|  0|  0|  0| 1| 0| 0| 0|
------------------------------------------- 

Así que puedes ver en la tabla que el único bit que comparten juntos es el 8 bit.

Segundo ejemplo

$a =  36;
$b = 103;
echo $a & $b; // This would output the number 36.
$a = 00100100
$b = 01100111

Los dos bits compartidos son 32 y 4, que cuando se suman devuelven 36.

El operador "O": |

$a =  9;
$b = 10;
echo $a | $b;

Esto daría como resultado el número 11. ¿Por qué?

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      |     |   0|  0|  0|  0| 1| 0| 1| 1|
-------------------------------------------

Notará que tenemos 3 bits establecidos, en las columnas 8, 2 y 1. Súmalos: 8 + 2 + 1 = 11.





php ternary-operator null-coalescing-operator php-7