2010-02-14 7 views
24

j'ai donc quelque chose comme ce qui suit:En utilisant une variable comme un opérateur

$a = 3; 
$b = 4; 
$c = 5; 
$d = 6; 

et je cours une comparaison comme

if($a>$b || $c>$d) { echo 'yes'; }; 

Que tous fonctionne très bien. Est-il possible d'utiliser une variable à la place de l'opérateur? Quelque chose comme:

$e = ||; 

Ce que je pourrais alors utiliser comme

if($a>$b $e $c>$d) { echo 'yes'; }; 

Répondre

21

Non, cette syntaxe n'est pas disponible. Le mieux que vous pourriez faire serait un eval(), qui ne serait pas recommandé, surtout si le $ e est venu de l'entrée de l'utilisateur (par exemple, une forme), ou une instruction switch avec chaque opérateur en cas

switch($e) 
{ 
    case "||": 
     if($a>$b || $c>$d) 
      echo 'yes'; 
    break; 
} 
0

Non, il n'y a aucun moyen de redéfinir les opérateurs (ou utiliser les opérateurs variables) en PHP AFAIK.

à court d'utiliser eval(), le plus proche que je peux penser est de créer une fonction:

function my_operator ($cond1, $cond2) 
{ 
    if (.... ) 
    return ($cond1 || $cond2); 
    else 
    return ($cond1 && $cond2); 

} 

if (my_operator(($a > $b), ($c > $d))) 
.... 
1

Non, il est impossible.

1

non. il n'y a aucun moyen de le faire en php.

0

Vous pourriez utiliser eval, mais vous pourriez facilement exposer votre site à toutes sortes d'attaques par injection de code si vous n'êtes pas très prudent.

Une solution plus sûre consisterait à faire correspondre l'opérateur proposé à une liste blanche prédéfinie, puis à appeler un bit correspondant si le code est codé en dur par l'opérateur.

C.

11

Il est impossible, mais vous pouvez utiliser une fonction à la place. Bien sûr, vous devrez les définir vous-même. Ce serait assez simple en utilisant des fermetures de PHP 5.3:

$or = function($x, $y) 
{ 
    return $x || $y; 
}; 

if ($or($a > $b, $c > $d)) 
{ 
    echo 'yes'; 
}; 
+1

+1. Fermetures FTW. – outis

3

Pour les chercheurs futurs, voici une fonction que je suis venu avec quand j'avais besoin d'ajouter pour réduire une liste des « critères supplémentaires » vagues et non définies de produits.

/** 
* Criteria checker 
* 
* @param string $value1 - the value to be compared 
* @param string $operator - the operator 
* @param string $value2 - the value to test against 
* @return boolean - criteria met/not met 
*/ 
protected function criteriaMet($value1, $operator, $value2) 
{ 
    switch ($operator) { 
     case '<': 
      return $value1 < $value2; 
      break; 
     case '<=': 
      return $value1 <= $value2; 
      break; 
     case '>': 
      return $value1 > $value2; 
      break; 
     case '>=': 
      return $value1 >= $value2; 
      break; 
     case '==': 
      return $value1 == $value2; 
      break; 
     case '!=': 
      return $value1 != $value2; 
      break; 
     default: 
      return false; 
    } 
    return false; 
} 

(modifier) ​​Voilà comment je l'ai utilisé:

// Decode the criteria 
$criteria = json_decode($addl_criteria); 

// Check input against criteria 
foreach ($criteria as $item) { 
    // Criteria fails 
    if (!criteriaMet($input[$item->key)], $item->operator, $item->value)) { 
     return false; 
    } 
} 
Questions connexes