Fonction Coalesce pour PHP?
de nombreux langages de programmation ont une fonction coalesce (renvoie la première valeur non nulle, exemple ). PHP, malheureusement en 2009, ne l'est pas.
quelle serait une bonne façon d'en implémenter une en PHP jusqu'à ce que PHP obtienne lui-même une fonction coalesce?
9 réponses
il y a un nouvel opérateur en php 5.3 qui fait ceci: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
PHP 7 introduit un véritable coalesce opérateur :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Si la valeur avant de la ??
n'existe pas ou est null
la valeur après le ??
.
l'amélioration par rapport à l'opérateur mentionné ?:
est, que le ??
gère également des variables non définies sans lancer un E_NOTICE
.
premier succès pour "PHP coalesce" sur google.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
j'aime vraiment le ?: opérateur. Malheureusement, il n'est pas encore appliqué sur mon environnement de production. Donc j'utilise l'équivalent de ceci:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
il est intéressant de noter qu'en raison du traitement par PHP des variables non initialisées et des indices de tableaux, tout type de fonction coalesce est d'utilisation limitée. J'aimerais être capable de faire cela:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
mais cela causera, dans la plupart des cas, une erreur de PHP avec un E_NOTICE. La seule façon de tester l'existence d'une variable avant de l'utiliser est de l'utiliser directement dans le vide() ou la fonction isset(). L'opérateur ternaire suggéré par Kevin est la meilleure option si vous savez que tous les options dans votre coalesce sont connues pour être initialisées.
assurez-vous d'identifier exactement comment vous voulez que cette fonction fonctionne avec certains types. PHP a une grande variété de type-vérification ou des fonctions similaires, donc assurez-vous que vous savez comment ils fonctionnent. Il s'agit d'un exemple de comparaison entre is_null () et empty ()
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
comme vous pouvez le voir, empty() retourne true pour tous ces derniers, mais is_null() ne le fait que pour 2 d'entre eux.
je suis l'expansion de la réponse publiée par Ethan Kent . Cette réponse rejettera les arguments non-nuls qui évaluent à false en raison du fonctionnement interne de array_filter , ce qui n'est pas ce que fait habituellement une fonction coalesce
. Par exemple:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
Oups
pour surmonter cela, un deuxième argument et une définition de la fonction sont nécessaires. Le callable fonction est responsable de dire array_filter
si oui ou non ajouter la valeur du tableau courant au tableau résultat:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
Ce serait bien si vous pouviez simplement passer isset
ou 'isset'
pour la 2ème argument array_filter
, mais pas de chance.
Je l'utilise actuellement, mais je me demande s'il ne pourrait pas être amélioré avec certaines des nouvelles fonctionnalités de PHP 5.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return $args[0];
}
PHP 5.3+, avec fermetures:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
Démo: https://eval.in/187365