Descripción general de PHP shorthand


He estado programando en PHP durante años, pero nunca he aprendido a usar cualquier forma abreviada. Me encuentro con él de vez en cuando en el código y tienen dificultades para leerlo, así que me gustaría aprender la forma abreviada diferente que existe para el lenguaje para que pueda leerlo y empezar a ahorrar tiempo/líneas al usarlo, pero parece que no puedo encontrar una visión general completa de toda la forma abreviada.

Una búsqueda en Google muestra casi exclusivamente la abreviatura de las declaraciones if/else, pero sé debe haber algo más que eso.

Por taquigrafía, estoy hablando de cosas como:

($var) ? true : false;
Author: GateKiller, 2010-12-31

9 answers

Estos son algunos de los operadores abreviados usados en PHP.

//If $y > 10, $x will say 'foo', else it'll say 'bar'
$x = ($y > 10) ? 'foo' : 'bar';

//Short way of saying <? print $foo;?>, useful in HTML templates
<?=$foo?>

//Shorthand way of doing the for loop, useful in html templates
for ($x=1; $x < 100; $x++):
   //Do something
end for;

//Shorthand way of the foreach loop
foreach ($array as $key=>$value):
   //Do something;
endforeach;

//Another way of If/else:
if ($x > 10):
    doX();
    doY();
    doZ();
else:
    doA();
    doB();
endif;

//You can also do an if statement without any brackets or colons if you only need to
//execute one statement after your if:

if ($x = 100)
   doX();
$x = 1000;

// PHP 5.4 introduced an array shorthand

$a = [1, 2, 3, 4];
$b = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
 66
Author: Click Upvote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 16:48:36

PHP 5.3 introducido:

$foo = $bar ?: $baz;

, el Cual asigna el valor de $bar a $foo si $bar evalúa a true (else $baz).

También puede anidar el operador ternario (con el uso adecuado de paréntesis).

Aparte de eso, no hay mucho más al respecto. Es posible que desee leer el documentación.

 22
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-31 00:43:23

Uno de mis "trucos" favoritos en PHP es usar el operador array union cuando se trata de situaciones tales como funciones que toman una matriz de argumentos, recurriendo a los valores predeterminados.

Por ejemplo, considere la siguiente función que acepta un array como argumento, y necesita saber que las llaves 'color', 'shape', y 'size' se establecen. Pero tal vez el usuario no siempre sabe cuáles serán, por lo que desea proporcionarles algunos valores predeterminados.

En un primer intento, uno podría intentar algo como esto:

function get_thing(array $thing)
{
    if (!isset($thing['color'])) {
        $thing['color'] = 'red';
    }
    if (!isset($thing['shape'])) {
        $thing['shape'] = 'circle';
    }
    if (!isset($thing['size'])) {
        $thing['size'] = 'big';
    }
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}

Sin embargo, usar el operador array union puede ser una buena "taquigrafía" para hacer esto más limpio. Considere la siguiente función. Tiene exactamente el mismo comportamiento que el primero, pero es más claro:

function get_thing_2(array $thing)
{
    $defaults = array(
        'color' => 'red',
        'shape' => 'circle',
        'size'  => 'big',
    );
    $thing += $defaults;
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}    

Otra cosa divertida es funciones anónimas, (y cierres, introducidos en PHP 5.3). Por ejemplo, para multiplicar cada elemento de una matriz por dos, solo podría hacer lo siguiente:

array_walk($array, function($v) { return $v * 2; });
 15
Author: mfonda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-31 00:56:13

Esto se llama el operador ternario, un operador booleano que tiene tres operandos:

La primera es la expresión booleana a evaluar.

La segunda es la expresión a ejecutar si la expresión booleana se evalúa como TRUE.

La tercera es la expresión a ejecutar si la expresión booleana se evalúa como FALSE.

 3
Author: Jacob Relkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-31 00:32:20

Nadie mencionó ??!

<?php
// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';

// The above is identical to this if/else statement
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}
 3
Author: Robert Pounder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 13:01:21

También nuevo en PHP7 es el operador de la nave espacial. Sobre todo útil en devoluciones de llamada para cosas como usort().

Antes:

usort($list, function ($a, $b) {
    if ($a == $b) return 0;
    return $a < $b;
});

Después de:

usort($list, function ($a, $b) { return $a <=> $b; });

Básicamente, devuelve un entero negativo, 0, o un entero positivo basado en la comparación del lado izquierdo con el lado derecho.

 2
Author: Okonomiyaki3000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-13 04:16:13

Por lo tanto, Jacob Relkin tiene toda la razón en que la "taquigrafía" que usted menciona se llama de hecho el operador "ternario", y como Sam Dufel añade, es muy frecuente en otros idiomas. Dependiendo de cómo el lenguaje lo implementa, incluso puede ser más rápido para el servidor interpretar la lógica, así como permitirle leerla más rápidamente.

Así que a veces lo que ayuda cuando estás aprendiendo una nueva pieza de lógica o nuevos operadores como este es pensar en el inglés (o lo que sea que su idioma nativo es) para encajar alrededor de él. Descríbelo en una oración. Vamos a hablar a través de su ejemplo:

($var) ? true : false;

Lo que esto debe leer como es esto:

¿Es var var cierto? Si var var es, devuelve el valor true. Si var var es false, devuelve el valor false.

El signo de interrogación te ayuda a recordar que estás haciendo una pregunta que determina la salida.

Un caso de uso más común para el operador ternario es cuando está comprobando algo que no es necesariamente un booleano, pero puedes usar lógica booleana para describirlo. Tomemos por ejemplo el objeto Car, que tiene una propiedad llamada color, que es una variable similar a una cadena (en PHP). No puedes preguntar si una cadena es verdadera o falsa porque eso no tiene sentido, pero puedes hacer diferentes preguntas al respecto:

$output = $car->color == "blue" ? "Wheee this car is blue!" : "This car isn't blue at all.";

echo $output;

Así que esta línea dice lo siguiente:

¿El color del coche es el mismo que la cadena "azul"?
Si lo es, devuelve la cadena " Whee this car is azul!", de lo contrario devuelve la cadena "Este coche no es azul en absoluto."

Lo que devuelve el operador ternario se utiliza en el lado derecho de una instrucción de asignación con output output, y esa cadena se imprime.

 1
Author: Mattygabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-15 03:42:53
<?php
class Bob {

    public function isDebug(){
        return true;
    }

    public function debug(){
        echo 'yes dice!!!';
    }
}


$bob = new Bob(); 

($bob->isDebug()) && $bob->debug(); 

Aquí hay otra versión de la taquigrafía. Espero que esto ayude a alguien

 1
Author: Natdrip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-09 00:38:14

Desde 5.4 también tiene literales de matriz por lo que ya no necesita escribir:

$myArray = array('some', 'list', 'of', 'stuff');

Puedes escribir:

$myArray = ['some', 'list', 'of', 'stuff'];

No es una gran diferencia, pero bastante agradable.

 0
Author: Okonomiyaki3000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 04:43:06