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