2010-12-31 10 views
32

He estado programando en PHP desde hace años, pero nunca aprendí a usar taquigrafía. Lo encuentro de vez en cuando en el código y me cuesta leerlo, así que me gustaría aprender las diferentes taquigrafías que existen para el idioma, de modo que pueda leerlo y comenzar a ahorrar tiempo/líneas al usarlo, pero Parece que no puedo encontrar una descripción completa de toda la taquigrafía.Vista general de la abreviatura de PHP

Una búsqueda en Google muestra de forma muy exclusiva la forma abreviada de declaraciones if/else, pero sé que debe haber algo más que eso.

Por taquigrafía, estoy hablando de cosas como:

($var) ? true : false; 
+0

¿Qué quiere decir con "taquigrafía"? –

+2

Esto no es Perl, no hay mucha "taquigrafía" en PHP. ¿Formas más cortas y más concisas de hacer ciertas cosas? Posiblemente. ¿Taquigrafía? No tanto. En general, su código se acortará al aprender qué hacen las diferentes funciones y encontrar una buena que haga lo que quiera, o combinar algunas de ellas para lograr el efecto deseado. – deceze

+0

Ahora en PHP 5.4: 'print $ var?: 'Foo'' si simplemente desea verificar si el valor es verdadero o usar una cadena predeterminada de" foo ". – Xeoncross

Respuesta

64

Estos son algunos de los operadores de taquigrafía que se usan 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]; 
+7

¿Cómo es esa * sintaxis alternativa * "taquigrafía"? Eso es a mano, en todo caso. Sin embargo, estaría de acuerdo con ' deceze

+0

'$ x = 'xxxx'; $ x && $ array ['nuevo'] = $ x'. ¿Qué significa esto? – Serjas

+0

'$ x = 'xxxx'; if ($ x AND ($ array ['news'] = $ x)) {// nada} ' – Xeoncross

3

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

La primera es la expresión booleana para evaluar .

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

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

+3

Además, este operador existe en la mayoría de los lenguajes estilo C, no solo en php. –

22

PHP 5.3 Introducción:

$foo = $bar ?: $baz; 

que asigna el valor de $bar-$foo si $bar evalúa a true (más $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 documentation.

+0

@Felix ¿Esto se compararía con el operador '||' en JavaScript? –

+0

@Jacob Relkin: No puedo decir si funciona igual en todos los casos, pero en general tiene el mismo efecto (para ser muy exactos, '||' en JS es '||' en PHP también;) (simplemente regresa) un booleano en PHP y no el valor)). –

+0

@Felix Sí, eso es lo que pensé. :) –

15

Uno de mis favoritos "trucos" en PHP es utilizar el operador array union cuando se trata de situaciones tales como las funciones que toman una serie de argumentos, volver a caer en los valores por defecto.

Por ejemplo, considere la siguiente función que acepta un array como argumento, y necesita saber que las claves '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, se 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, usando el operador gama unión puede ser una buena "abreviada" para hacer este limpiador. Considera la siguiente función. Tiene el mismo comportamiento exacto como la primera, 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 anonymous functions, (y cierres, introducido en PHP 5.3).Por ejemplo, para múltiples cada elemento de una matriz en dos, usted podría hacer lo siguiente:

array_walk($array, function($v) { return $v * 2; }); 
+0

'matriz_mapa 'también se puede usar para hacer lo mismo como array_walk? –

+0

Son similares. 'array_map' acepta una matriz por valor y devuelve una nueva matriz, mientras que' array_walk' modifica la matriz en sí misma. – mfonda

+1

+1 para compensar el downvote aleatorio. Ese es un código legítimo. Prefiero 'array_merge ($ defaults, $ thing)', pero los sindicatos también están bien. – deceze

1

Así, Jacob Relkin tiene toda la razón en que la "forma abreviada" que mencionas es, en efecto llamado el "ternaria" operador, y como Sam Dufel agrega, es muy frecuente en otros idiomas. Dependiendo de cómo lo implemente el lenguaje, incluso puede ser más rápido para el servidor interpretar la lógica, así como permitirte leerla más rápidamente.

Por lo tanto, a veces lo que ayuda cuando se está aprendiendo una nueva lógica o los nuevos operadores como este es pensar en el inglés (o cualquiera que sea su idioma nativo) para adaptarse a él. Descríbalo en una oracion Vamos a hablar a través de su ejemplo:

($var) ? true : false; 

Lo que esto debe leerse como es esto:

es de $ var cierto? Si $ var es, devuelva el valor true. Si $ var es falso, devuelve el valor falso.

El signo de interrogación ayuda a recordarle que está 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 puede usar la lógica booleana para describirlo. Tomemos por ejemplo el objeto Car, que tiene una propiedad llamada color, que es una variable tipo cadena (en PHP). No se puede pedir si una cadena es verdadera o falsa, porque eso no tiene sentido, pero se puede pedir a 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 se lee como sigue:

es el color de coche lo mismo que la cadena "azul"?
Si lo es, devuelva la cadena "¡Si este auto es azul!", de lo contrario devolver la cadena "Este auto no es azul en absoluto".

Lo que sea que el operador ternario regrese se está utilizando en el lado derecho de una declaración de asignación con $ output, y esa cadena se imprime.

1
<?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

2

¡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

Introducido en PHP 7, unos 5 años después de que se hizo la pregunta. Un operador útil de hecho. Más sobre '??' y '?:' Aquí: https://stackoverflow.com/questions/34571330/php-ternary-operator-vs-null-coalescing-operator –

2

También es nuevo en PHP7 el operador de nave espacial. Principalmente útil en devoluciones de llamadas para cosas como usort().

Antes:

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

Después:

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

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

+0

Algo relacionado con este ejemplo, en el futuro habrá probablemente sea una sintaxis de función anónima taquigráfica para que el ejemplo se pueda acortar más a algo como: 'usort ($ list, fn ($ a, $ b) => $ a <=> $ b);' Esto puede parecer un poco confuso pero simplemente significa que la izquierda de '=>' es la firma de la función y la derecha de ella es el cuerpo que es solo una línea y devuelve el resultado de esa línea (a pesar de que 'return' no está escrito explícitamente). – Okonomiyaki3000

0

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

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

simplemente puede escribir:

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

No hay una gran diferencia, pero bastante agradable.

Cuestiones relacionadas