2010-02-14 10 views
24

Così ho qualcosa di simile al seguente:Utilizzando una variabile come un operatore

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

e corro un confronto omogeneo

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

che tutte le opere che bene. È possibile utilizzare una variabile al posto dell'operatore? Qualcosa di simile:

$e = ||; 

quale ho potuto quindi utilizzare come

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

risposta

21

No, quella sintassi non è disponibile. Il meglio che si possa fare sarebbe un eval(), che non sarebbe consigliabile, soprattutto se il $ e proveniva da input dell'utente (ad esempio, un modulo), o un'istruzione switch con ogni operatore come un caso

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

No, non c'è modo di ri-definire operatori (o utilizzare operatori variabili) in PHP AFAIK.

corto di utilizzare eval(), la più vicina mi viene in mente è la creazione di una funzione:

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

} 

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

No, non è possibile.

1

no. non c'è modo di farlo in PHP.

0

È possibile utilizzare eval, ma si potrebbe facilmente finire per esporre il sito a tutti i tipi di attacchi di iniezione di codice se non si sta molto attenti.

Una soluzione più sicura sarebbe quella di abbinare l'operatore proposto a una lista bianca predefinita e quindi chiamare un bit corrispondente se il codice con l'operatore è codificato.

C.

11

Non è possibile, ma è possibile utilizzare invece una funzione. Certo, dovresti definirli da solo. Questo sarebbe abbastanza semplice utilizzando PHP 5.3 di chiusure:

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

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

+1. Chiusure FTW. – outis

3

Per i ricercatori futuri, ecco una funzione che mi è venuta quando ho avuto l'obbligo di aggiungere alcuni "criteri supplementari" vago e indefinito per restringendo la lista di prodotti.

/** 
* 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; 
} 

(edit) Ecco come ho usato:

// 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; 
    } 
} 
Problemi correlati