Php argument de fonction de suppression d'erreur, empty() la fonction isset() de l'émulation

StackOverflow https://stackoverflow.com/questions/55060

Question

Je suis sûr que la réponse à cette question est non, mais dans le cas où il y a un peu de PHP gourou

est-il possible d'écrire une fonction dans une voie où les arguments non valides ou inexistant, les variables peuvent être passées en et php ne sera pas d'erreur sans l'utilisation de '@'

Un peu comme vide et isset faire.Vous pouvez passer une variable que vous venez de faire et de ne pas erreur.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice
Était-ce utile?

La solution

Pour résumer, la bonne réponse est non, vous ne devriez pas (voir la mise en garde ci-dessous).

Il existe des solutions de contournement déjà mentionné par de nombreuses personnes dans ce fil, comme l'utilisation de variables de référence ou la fonction isset() ou vide() dans les conditions et la suppression de l'avis dans la configuration de PHP.Que, en plus de l'évidente solution de contournement, à l'aide de @, dont vous ne souhaitez pas.

Résumer un intéressant commentaire la discussion avec Gerry:De passer la variable par référence est en effet valable que si vous vérifier la valeur de la variable à l'intérieur de la fonction et la poignée indéfini ou null en cas correctement.Il suffit de ne pas utiliser de référence passant comme un moyen de fermeture de PHP en place (ce est l'endroit où mon origine ne devrait pas points).

Autres conseils

Vous n'obtenez pas d'erreur lorsque la variable est passée par référence (PHP va créer une nouvelle variable en silence):

 function myHappyFunction(&$var)
 {       
 }

Mais je vous recommande de ne pas abuser de ce pour cacher les erreurs de programmation.

Vous pouvez faire cela en utilisant func_get_args comme suit:

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

Cette func va encore plus loin et vous donnent la première valeur non vide de n'importe quel nombre d'arguments (vous pouvez toujours la force pour ne prendre jusqu'à deux arguments mais cela plus utile pour moi comme ça).

EDIT:la version originale n'a pas utilisé compact pour essayer de faire un tableau d'arguments et lui a TOUJOURS donné une erreur.Les rapports d'erreurs augmenté d'un cran et cette nouvelle version compacte est un peu moins bien rangé, mais tout à fait la même chose et permet de fournir une valeur par défaut pour inexistante vars.

Valide les cas où le contrôle devient lourd et unnessesary.
Donc j'ai écrit cette petite fonction magique:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

Il ne nécessite pas de modifications à myHappyFunction().
Vous aurez à changer

myHappyFunction($someBogusVar);

pour

myHappyFunction(value($someBogusVar));

En indiquant votre intention explicitement.ce qui le rend les bonnes pratiques dans mon livre.

Non, parce que ce n'est pas vraiment quelque chose à faire avec la fonction;l'erreur est venue de tenter de référence inexistante clé du tableau.Vous pouvez modifier le niveau d'avertissement de votre configuration de PHP pour réduire ces erreurs, mais vous êtes mieux de simplement de ne pas faire cela.

Cela dit, vous pourrait faire quelque chose comme

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

Et l'utiliser à la place de la clé du tableau de recherche

defaultValue(safeLookup($foo, "bar"), "baz);

Maintenant, j'ai besoin de prendre une douche :)

est-il possible d'écrire une fonction dans une voie où les arguments non valides ou inexistant, les variables peuvent être passées en et php ne sera pas d'erreur sans l'utilisation de '@'

Oui, vous pouvez!

porneL est correct [edit:je n'ai pas assez de points pour le lien de sa réponse ou de voter, mais c'est sur cette page]

Il est également raison lorsqu'il met en garde ", Mais je vous recommande de ne pas abuser de ce pour cacher les erreurs de programmation". cependant, la suppression d'erreur via le Contrôle d'Erreur de l'Opérateur (@) devraient également être évités pour cette même raison.

Je suis nouveau sur Stack Overflow, mais j'espère que c'est pas commun pour une réponse incorrecte à être classé le plus élevé sur une page alors que la bonne réponse ne reçoit pas de voix.:(

@Brian:J'utilise un trinary opération pour faire le chèque pour moi:

return $value ? $value : $default;

cela renvoie valeur en$, OU, $par défaut.Selon la valeur de $de la valeur.Si c'est 0, false, vide ou quelque chose de similaire à la valeur en dollars par défaut sera retourné.

Je suis plus pour le défi à émuler les fonctions comme vide() et la fonction isset()

@Sean Qui a déjà été répondu par Brian

return isset($input) ? $input : $default;

Sean, vous pourriez faire:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

EDIT:

Je suis sûr qu'il pourrait être un grand discussion sur les opérateurs ternaires vrs les appels de fonction.Mais le point de cette la question était de voir si nous pouvons créer un fonction qui ne renvoie pas d'erreur si un inexistante valeur est passée en sans l'aide de la '@'

Et je vous l'ai dit, vérifier avec isset().Un conditionnel ternaire de la première partie ne vérifie pas la valeur null ou not null, il vérifie true ou false.Si vous essayez de vérifier true ou false sur une valeur null en PHP, vous pouvez obtenir ces mises en garde. isset() vérifie si une variable ou une expression retourne une valeur null ou n'est pas, et il renvoie un booléen, qui peut être évaluée par la première partie de votre ternaire sans erreurs.

Je suis sûr qu'il pourrait y avoir un grand débat sur les opérateurs ternaires vrs appels de fonction.Mais le point de cette question était de voir si nous pouvons créer une fonction qui ne renvoie pas d'erreur si un inexistante valeur est transmise sans l'aide de la '@'

Si la réponse à la question d'origine est "non", il ya des options, personne n'a mentionné.

Lorsque vous utilisez le signe@, tous PHP est en train de faire est primordial de l' error_reporting niveau et temporairement le réglage à zéro.Vous pouvez utiliser "ini_restore('error_reporting');"pour le mettre en revenir à ce qu'il était avant le @ a été utilisé.

Cela a été utile pour moi dans la situation où je voulais écrire une fonction de commodité pour vérifier et voir si une variable a été définie, et qu'il a eu d'autres propriétés, sinon, retourner une valeur par défaut.Mais, l'envoi d'un unset variable par le biais causé une notice PHP, j'ai donc utilisé le @ pour supprimer, mais ensuite définir error_reporting retour à la valeur d'origine à l'intérieur de la fonction.

Quelque chose comme:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

Ainsi, dans le cas ci-dessus, si $bar n'est pas réglé, je ne rentrerai pas une erreur quand je l'appelle foo() avec un inexistante variable.Cependant, je vais avoir une erreur dans la fonction où j'ai tapé par erreur is_set au lieu de isset.

Cela pourrait être une option utile couvrant que la question initiale a été de demander à l'esprit, si ce n'est en réalité.

Si vous ajoutez simplement une valeur par défaut pour le paramètre, vous pouvez l'ignorer lors de l'appel de la fonction.Par exemple:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}

Avec une seule ligne, vous pouvez réaliser cela: myHappyFunction($someBogusVar="");

J'espère que c'est ce que vous cherchez.Si vous lisez la documentation de php, en vertu de valeur par défaut des arguments, vous pouvez voir que l'attribution d'une valeur par défaut à une fonction de l'argument permet de vous éviter un message d'erreur lors de l'utilisation de fonctions.

Dans cet exemple vous pouvez voir la différence de l'aide d'un argument par défaut et ses avantages:

Code PHP:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

De sortie pour test1() lignes:

Avertissement:Missing argument 1 for test1() .
Bonjour.
.
Bonjour tout le monde.

De sortie pour test2() lignes:

.
Bonjour.

Bonjour tout le monde.

Cela peut également être utilisé en combinaison à isset() et d'autres fonctions à accomplir ce que vous voulez.

Et d'aller plus loin dans l'abstraction l'arbre, de quoi êtes-vous à l'aide de cet objet?

Vous pouvez soit initialiser ces valeurs dans chaque catégorie, selon le cas, ou de créer une classe spécifique contenant toutes les valeurs par défaut et les attributs, tels que:

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

L'idée étant que, lors de l'utilisation de defaultValue fonction partout, en haut et en bas dans votre code, il deviendra un entretien cauchemar à chaque fois que vous devez changer une valeur, à la recherche de tous les endroits où vous avez mis une valeur d'appel.Et il va probablement vous conduire à répéter vous-même, en violation de SÉCHER.

Alors que c'est un lieu unique pour stocker toutes ces valeurs par défaut.Vous pourriez être tenté d'éviter la création de celles-setters et getters, mais ils aident également dans l'entretien, dans le cas où il becomse pertinent de faire quelques modification de sorties ou d'une validation des entrées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top