2010-02-14 19 views
24

So habe ich etwas wie folgt aus:eine Variable als Operator verwenden

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

und ich laufe nur gut einen Vergleich wie

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

Das alles funktioniert. Ist es möglich, eine Variable anstelle des Operators zu verwenden? Etwas wie:

$e = ||; 

die ich dann als

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

Antwort

21

Nein, diese Syntax ist nicht verfügbar. Das Beste, was Sie tun könnten, wäre eine eval() sein, die empfohlen werden, würden nicht, vor allem, wenn der $ e aus Benutzereingaben kam (dh eine Form), oder eine switch-Anweisung mit jedem Operator als Fall

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

Nein, es gibt keinen Weg neu definieren Operatoren (oder variable Operatoren) in PHP AFAIK verwenden könnte.

Short eval() der Verwendung, in der Nähe ich denken kann, ist die Schaffung einer Funktion:

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

} 

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

Nein, es ist nicht möglich.

1

nein. Es gibt keine Möglichkeit, dies in PHP zu tun.

0

Sie könnten Eval verwenden, aber Sie könnten leicht Ihre Website allen Arten von Code-Injektion-Angriffen aussetzen, wenn Sie nicht sehr vorsichtig sind.

Eine sicherere Lösung wäre, den vorgeschlagenen Operator mit einer vordefinierten Whitelist abzugleichen und dann ein entsprechendes Bit aufzurufen, wenn der Code mit dem Operator fest codiert ist.

11

Es ist nicht möglich, aber Sie könnten stattdessen eine Funktion verwenden. Natürlich müssten Sie sie selbst definieren. Dies wäre ziemlich einfach seine Schließung mit PHP 5.3 ist:

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

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

+1. Verschlüsse FTW. – outis

3

Für zukünftige Forscher, hier ist eine Funktion, die ich kam mit, wenn ich eine Anforderung hatte einige vage und unbestimmt „zusätzliche Kriterien“ für die Eingrenzung eine Liste hinzufügen von Produkten.

/** 
* 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) Hier ist, wie ich es benutzt:

// 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; 
    } 
} 
Verwandte Themen