2009-03-11 9 views
5

Comme certains le savent, C# a un opérateur très utile ?? qui évalue et retourne l'expression sur la droite si l'expression à gauche est nulle. Il est très utile pour fournir des valeurs par défaut, par exemple:PHP et ?? opérateur

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

Si readSetting n'a pas pu trouver "spaces" et retourne null, la variable spaces détiendrait la valeur par défaut de 5.

Vous pouvez faire presque la même chose dans JavaScript et Ruby avec || opérateur, comme dans

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

bien que vous ne pourriez pas avoir 0 comme valeur de spaces en JavaScript dans ce cas et dans les deux false Ruby et JavaScript .

PHP a or opérateur et même si elle ne fonctionne pas comme || dans un sens où il ne retourne pas l'expression de la droite, il pourrait encore être utile ici:

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

avec la note "" et "0" sont également traités comme false en PHP en plus de false, 0 et null dans la plupart des langues.

La question est, dois-je utiliser la construction d'en haut? A-t-il des effets secondaires en dehors de traiter une grande classe de caractères comme faux? Et y at-il une meilleure construction qui est habituellement utilisée et recommandée par la communauté PHP cette tâche?

Répondre

1

Si vous voulez vous assurer que vous obtenez faux ou nul, et ne pas traiter des choses comme « 0 » comme « faux », vous pourriez faire ce qui suit:

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

L'opérateur === en PHP semble une correspondance identique, donc "0", "", ne sera pas synonyme de faux. Évidemment, vous pourriez vouloir relooker le code à votre goût, mais vous avez l'idée.

6

C'est une bonne idée d'être plus explicite dans des cas comme celui-ci, particulièrement en PHP car il a des règles de conversion de type quelque peu déroutantes (par exemple "0" est faux comme vous l'avez souligné).

Si vous voulez être strict, laissez votre fonction readSettings retourner le réglage correct ou une valeur bien définie si aucun réglage n'est trouvé, par ex. null. Ensuite, vous devez l'utiliser comme:

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

Si vous voulez être plus généreux et ne voulez utiliser des espaces $ à être vide, utilisez:

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

Vous pouvez raccourcir le coût d'un deuxième appel de fonction ou des constructions laides (non recommandé):

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

Mais attention si vous voulez 0 être une valeur valide pour $spaces!

De l'Zen of Python:

explicite est mieux que implicite.

Dans votre cas, je vous recommande d'ajouter juste une seconde paramter $default-readSettings():

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

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

Comment cela?

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

Ou, plus confuse, mais en utilisant une seule variable:

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

PHP 5.3.0 donne une version plus courte de la condition de l'opérateur ternaire vrai: faux qui se présente comme suit:

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

S'il vous plaît noter que PHP 5.3.0 est encore en version bêta et pas encore prêt pour la production (son candidat de libération déjà bien), mais il donne beaucoup de nouveaux trucs cool comme des fonctions lambda et espaces de noms aussi, il est donc sans aucun doute vaut la peine de vérifier les fonctionnalités!

Voici un article qui décrit les nouvelles fonctionnalités assez bien:

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

+0

Je ne vois aucune référence à: dans l'article lié. –

1

PHP 7 prend en charge maintenant ?? comme le opérateur Null coalescent

L'opérateur coalescent nul (??) a été ajouté en tant que sucre syntaxique pour le cas fréquent d'avoir besoin d'utiliser un ternaire en liaison avec isset(). Il retourne son premier opérande si elle existe et est NULL; sinon il retourne son deuxième opérande.

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