2010-02-14 9 views
24

así que tengo algo como lo siguiente:Usando una variable como un operador

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

y corro como una comparación

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

que todas las obras bien. ¿Es posible usar una variable en lugar del operador? Algo así como:

$e = ||; 

que luego podrían utilizar como

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

Respuesta

21

No, esa sintaxis no está disponible. Lo mejor que podría hacer sería una eval(), que no sería recomendable, sobre todo si el $ e vino de entrada del usuario (es decir, una forma), o una sentencia switch con cada operador como un caso

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

No, no hay manera de volver a definir los operadores (o utilice los operadores variables) en PHP que yo sepa.

corto de utilizar eval(), el más cercano que se me ocurre es la creación de una función:

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

} 

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

No, no es posible.

1

no. no hay forma de hacer esto en php.

0

Podría usar eval, pero podría terminar fácilmente exponiendo su sitio a todo tipo de ataques de inyección de código si no tiene mucho cuidado.

Una solución más segura sería hacer coincidir el operador propuesto con una lista blanca predefinida y luego llamar al bit correspondiente si el código con el operador está codificado.

C.

11

No es posible, pero se puede utilizar una función en su lugar. Por supuesto, tendrías que definirlos tú mismo. Esto sería bastante sencillo usando PHP 5.3 cierres:

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

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

+1. Cierres FTW. – outis

3

Para los futuros buscadores, aquí es una función que se me ocurrió cuando tuve un requisito para agregar algunos "criterios adicionales" vagas e indefinidas para la reducción a una lista de productos.

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

(editar) Así es como lo utilicé:

// 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; 
    } 
} 
Cuestiones relacionadas