2010-09-17 10 views
17

Esencialmente, me encantaría poder definir una variable como una cosa a menos que esa cosa no exista. Juro que en algún lugar vi un condicional abreviada que parecía algo como esto:Condicional de taquigrafía para definir una variable en función de la existencia de otra variable en PHP

$var=$_GET["var"] || "default"; 

Pero no puedo encontrar ninguna documentación que hacer esto bien, y la verdad es que podría haber sido JS o ASP o algo donde lo vi .

Entiendo que todo lo que debería estar sucediendo en el código anterior es solo para comprobar si alguna de las declaraciones devuelve verdadero. Pero pensé que vi a alguien hacer algo que esencialmente definió un valor predeterminado si el primero falló. ¿Es esto algo que alguien conoce y puede ayudarme? ¿Estoy loco? Sólo parece redundante decir:

$var=($_GET["var"]) ? $_GET["var"] : "default"; 

o especialmente redundante decir:

if ($_GET["var"]) { $var=$_GET["var"]; } else { $var="default"; } 

Pensamientos?

+0

Sí, es estúpido php no puede hacer esto, cualquiera sabe si puede hacerlo a partir de 5.6? –

+1

@DominicTobias La respuesta aceptada funciona en 5.3+ –

+0

Posible duplicado de [Configuración de valores predeterminados (asignación condicional)] (http://stackoverflow.com/questions/163092/setting-default-values-conditional-assignment) –

Respuesta

14

Matthew ya ha mencionado la única manera de hacerlo en PHP 5.3. Tenga en cuenta que también les puede encadenar:

$a = false ?: false ?: 'A'; // 'A' 

Esto no es lo mismo que:

$a = false || false || 'A'; // true 

La razón es que PHP es como la mayoría de los lenguajes tradicionales en este aspecto. El OR lógico siempre devuelve true o false. Sin embargo, en JavaScript, se utiliza la expresión final. (En una serie de RUP, será el primero no falso).

var a = false || 'A' || false; // 'A' 
var b = true && 'A' && 'B'; // 'B'; 
+0

Otro Mateo eliminó su respuesta porque no le gustó que la respuesta no siguiera sus mejores prácticas personales, por lo que la eliminó. Por lo tanto, estoy marcando esto como correcto porque se expande en la respuesta original. Para el registro, las preocupaciones de Matthew se expresan en la respuesta de Fanis. Son preocupaciones válidas, pero la respuesta a mi pregunta es de hecho '?:', Como se muestra aquí. –

7

En tales casos, debe comprobar la existencia de la variable en $ _GET y luego si es válida para sus parámetros. Por ejemplo:

$var = (isset($_GET["var"]) && $_GET['var'] !== '') ? $_GET["var"] : "default"; 

Sin embargo, esto puede volverse bastante ilegible con bastante rapidez. Yo diría que siga siendo legible por inicializar primero la variable a un defecto de seguridad, y luego sobrescribir que con una externa, si eso es válido:

$var = "default"; 
if (isset($_GET['var') && $_GET['var'] !== '') { 
    $var = $_GET['var] ; 
} 

En cuanto a su primer ejemplo, $var=$_GET["var"] || "default"; existe en Javascript: var someVar = incomingVar || "default";

+0

@Ben, esta debería ser probablemente la respuesta aceptada. Es un poco más largo, pero evita advertencias. Además, el control contra! == '' no se trata realmente de la existencia, aunque puede ser útil para ciertos casos. –

+0

@MatthewFlaschen Esto en realidad no responde la pregunta que tenía. Plantea preocupaciones válidas, así que lo he votado a favor. Pero la pregunta era si había una manera de lograr lo que hiciste, taquigrafía. –

2

Siempre he usado vacío.

$var = !empty($_GET['var'])?$_GET['var']:'default'; 
+0

Supongo que si usa $ _GET, nunca obtendrá una respuesta booleana, por lo que 'empty' no se puede distinguir de' isset', pero esta parece ser una peor forma de hacerlo en otras situaciones: '$ var =! Empty ($ other_var)? $ other_var: true' hará que $ var * always * sea igual a true. Aunque, supongo, también lo hará la notación JS 'var = other_var || cierto'. –

Cuestiones relacionadas