2010-07-24 7 views
1

Ceci est une chose mineure, mais ça me dérange depuis un moment. J'ai fouetté mon cerveau pour un moyen d'écrire des déclarations comme ceci sans toute répétition de code. Par exemple:Test et écho sans répétition?

echo isset($array[0])? $array[0]: 'not set'; 
$var = empty($other_var)? '$other_var not set': $other_var; 

Y at-il une sorte de test et retour (pour les premiers) ou un test-and-set (pour ce dernier) opérateur, je ne sais pas? Cela peut sembler un point mineur, mais la duplication semble inutile et peut conduire à de très longues lignes qui peuvent compliquer la maintenance. Tenir compte:

$another_var = array_key_exists($array[Utility::FindIndex($username)][Constants::App_CRITERION], $haystack[NthDimension('my dimensional indicator')])? $array[Utility::FindIndex($username)][Constants::App_CRITERION], $haystack[NthDimension('my dimensional indicator')]: 'not set'; 

Oui, oui, la ligne ci-dessus est totalement artificiel, mais il est pas impensable que quelque chose comme cela pourrait se produire. Il me semble étrange qu'il n'y ait pas moyen de tester quelque chose et d'attribuer sa valeur (si elle est vraie) sans répétition sans répétition.

+2

Il est trivial de créer votre propre fonction d'utilité faire cela pour vous n'est-ce pas? (En fait la page de doc de isset inclut d'autres fonctions de peuples pour cela dans les commentaires: http://php.net/manual/en/function.isset.php) –

+0

Votre deuxième code n'a pas de sens pour moi: '$ array [ Utilitaire :: FindIndex ($ username)] [Constantes :: App_CRITERION], $ haystack [NthDimension ('mon indicateur dimensionnel')] 'Qu'est-ce que c'est censé être? (Je fais référence à la partie dans la clause '?', Pas 'array_key_exists'.) – NikiC

Répondre

2

Je pense que dans PHP 6 il y avait une fonction prévue issetor ou quelque chose de similaire. Mais je ne peux pas me souvenir du nom. Et PHP 6 est mort de toute façon.

Alors, écrivez-vous:

function issetor(&$var, $default) { 
    return isset($var) ? $var : $default; 
} 

echo issetor($_GET['me'], 'you'); 

Si vous voulez le rendre encore plus abstraite, regardez ceci:

function isor(&$var, $default, $condition) { 
    if (!is_callable($condition)) { 
     throw new InvalidArgumentExpression('condition not callable!'); 
    } 

    return $condition($var) ? $var : $default; 
} 

// this is equivalent to issetor($_GET['me'], 'you'); 
echo isor($_GET['me'], 'you', function(&$var) { return isset($var); }); 

// but you may use a more complicated thing here, too: 
echo isor($_GET['me'], 'you', function($var) use($allowed) { return in_array($var, $allowed); }); 
// this is equivalent to: 
echo in_array($_GET['me'], $allowed) ? $_GET['me'] : 'you'; 
// now the "normal" version is still shorter. But using isor allows you to store often used $condition closures in variables. For example, if you want to check if several values are in an array, you could write: 
$isAllowed = function ($var) use ($allowed) { 
    return in_array($var, $allowed); 
}; 
$a = isor($a, 'default', $inAllowed); 
$b = isor($b, 'default', $inAllowed); 
$c = isor($c, 'default', $inAllowed); 
$d = isor($d, 'default', $inAllowed); 

Si vous voulez passer des variables supplémentaires à votre fonction de condition sans toujours use fermant des fermetures, vous pouvez ajouter un autre argument. (Notez que je n'ai pas utilisé un tableau d'arguments et call_user_func_array, parce que vous ne pouvez pas passer par référence à l'aide, mais vous pouvez évidemment étendre le code il le fait.)

function isor(&$var, $default, $condition, $addArgument = null) { 
    if (!is_callable($condition)) { 
     throw new InvalidArgumentExpression('condition not callable!'); 
    } 

    return $condition($var, $addArgument) ? $var : $default; 
} 

// the above in_array condition: 
echo isor($a, 'default', 'in_array', $allowed); 
2

Il ne traitera pas la isset() cas, qui est un cas d'utilisation principal pour ce modèle, mais PHP 5.3 a une forme courte pour l'opérateur ternaire.

$new_val = $if_true ? $if_true : $if_false; 

peut être raccourci à

$new_val = $if_true ?: $if_false; 

Je ne pouvais pas trouver dans les documents, étrangement, mais voici une question à ce sujet: What is ?: in PHP 5.3?

+2

voir http://svn.php.net/viewvc?view=revision&revision=246551 – VolkerK