Динамически выбирать оператор сравнения (> =, <= и т. Д.) В условном выражении?

if (foo >= bar) baz(); 

Но скажем, иногда baz (); должен быть запущен, когда foo <= bar , или foo == bar … и предположим, что этот оператор сравнения схвачен, скажем, из таблицы db, и помещен в переменную: $param = ">=" .

Можно ли каким-либо образом изменить первую строку для использования параметра $param , кроме случая переключения с несколькими операторами if?

В моем коде baz(); охватывает целый ряд строк и станет организационным кошмаром, если бы я управлял им вручную.

 function lt($a, $b) { return $a < $b; } ... $relops = Array( '<' => 'lt', ... ); echo $relops['<'](2, 3); 

Я решил это, используя:

 function doComparison($a, $operator, $b) { switch ($operator) { case '<': return ($a < $b); break; case '<=': return ($a <= $b); break; case '=': return ($a == $b); break; // SQL way case '==': return ($a == $b); break; case '!=': return ($a != $b); break; case '>=': return ($a >= $b); break; case '>': return ($a > $b); break; } throw new Exception("The {$operator} operator does not exists", 1); } 

Использовать eval () ?

 $param = ">="; eval ("if (foo $param bar ) baz();"); 

Подробнее читайте на странице документации для функции eval.

РЕДАКТИРОВАТЬ:

Действительно, как отмечали другие, если есть альтернативы, они почти всегда лучше, чем eval (). Если используется, его следует использовать с осторожностью.

уточняя мой комментарий:

 function variableOpComparison($v1, $v2, $o) { if ($o == '!=') return ($v1 != $v2); // could put this elsewhere... $operators = str_split($o); foreach($operators as $operator) { switch ($operator) { // return will exit switch, foreach loop, function case '>': if ($v1 > $v2) return true; else continue; break; case '<': if ($v1 < $v2) return true; else continue; break; case '=': if ($v1 == $v2) return true; else continue; break; default: throw new Exception('Unrecognized operator ' . $operator . ' in ' . $o); } } return false; }