2009-03-11 10 views
5

Como algunas personas saben, C# tiene un operador ?? muy útil que evalúa y devuelve expresión a la derecha si la expresión de la izquierda es nula. Es muy útil para proporcionar valores por defecto, por ejemplo:PHP y ?? operador

int spaces = readSetting("spaces") ?? 5; 

Si readSetting no pudo encontrar "spaces" y devuelve un valor nulo, variables spaces sostendría valor predeterminado de 5.

Se podría hacer casi lo mismo en JavaScript y Ruby con || operador, como en

var spaces = readSetting("spaces") || 5; 

aunque no se podía tener 0 como valor de spaces en JavaScript en este caso y false tanto en Ruby y JavaScript .

PHP tiene or operador y aunque no funciona como || en un sentido que no devuelve la expresión de la derecha, aún podría ser útil aquí:

$spaces = readSetting('spaces') or $spaces = 5; 

con la nota que "" y "0" también se tratan como false en PHP además de false, 0 y null en la mayoría de los idiomas.

La pregunta es, ¿debería usar la construcción de arriba? ¿Tiene efectos secundarios además de tratar a la clase grande de caracteres como falsa? ¿Y hay una mejor construcción que esta comunidad usualmente usa y recomienda la comunidad PHP?

Respuesta

1

Si usted quiere garantizar que se obtiene falsa o nula, y no trata las cosas como "0" como "falsa", se puede hacer lo siguiente:

$spaces = readSetting('spaces'); 
if($spaces == null || $spaces === false) $spaces = 5; 

El operador === en PHP busca una coincidencia idéntica, por lo que "0", "", no equivale a falso. Obviamente, es posible que desee volver a diseñar el código a su gusto, pero se entiende la idea.

6

Es una buena idea ser más explícito en casos como este, especialmente en PHP, ya que tiene reglas de conversión de tipo algo confusas (por ejemplo, "0" es falso como usted señaló).

Si quiere ser estricto, deje que su función readSettings devuelva la configuración correcta o un valor bien definido si no se encuentra ninguna configuración, p. null. A continuación, se debe utilizar como:

$spaces = readSettings('spaces'); 
if (null === $spaces) { 
    $spaces = 5; 
} 

Si quieres ser más generoso y sólo desea $ espacios a que no está vacía, utilice:

$spaces = readSettings('spaces'); 
if (empty($spaces)) { // or: if (!$spaces) { 
    $spaces = 5; 
} 

Usted podría reducir su longitud por el costo de una segunda llamada a la función o construcciones feas (no recomendado):

$spaces = readSettings('space') ? readSettings('space') : 5; 
$spaces = ($x = readSettings('space')) ? $x : 5; // UGLY! 

Pero cuidado si quieres 0 ser un valor válido para $spaces!

Desde el Zen of Python:

Explícito es mejor que implícito.

En su caso se lo recomendaría a sólo tiene que añadir un segundo parametro $default a readSettings():

function readSettings($key, $default=null) { 
    return isset($settings[$key]) ? $settings[$key] : $default; 
} 

$spaces = readSettings('spaces', 5); 
4

¿Qué tal esto?

$spaces = ($tmp=readSettings('space')) ? $tmp : 5; 

O, más confuso, pero utilizando sólo una variable:?

$spaces = ($spaces=readSettings('space')) ? $spaces : 5; 
6

PHP 5.3.0 da una versión más corta de la condición de operador ternario true: true que va de la siguiente manera:

$spaces = readSettings('spaces') ?: 5;

Tenga en cuenta que PHP 5.3.0 todavía está en versión beta y aún no está listo para producción (aunque ya es un candidato de lanzamiento), pero también ofrece muchas cosas nuevas como funciones y espacios de nombres lambda, por lo que definitivamente vale la pena comprobar las características!

Aquí es un artículo que describe las nuevas características bastante bien:

http://www.sitepoint.com/article/whats-new-php-5-3/

+0

no puedo ver ninguna referencia a:? En el artículo enlazado. –

1

PHP 7 soporta ahora ?? como el operador coalescente Null

El operador coalescente nula (??) se ha añadido como azúcar sintáctico para el caso común de la necesidad de utilizar un ternario en conjunción con isset(). Devuelve su primer operando si existe y no es NULL; de lo contrario, devuelve su segundo operando.

<?php 
// 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'; 

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
?> 

http://php.net/manual/en/migration70.new-features.php