Использование переменной в качестве оператора

Поэтому у меня есть что-то вроде следующего:

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

и я выполняю сравнение как

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

Все работает отлично. Можно ли использовать переменную вместо оператора? Что-то вроде:

 $e = ||; 

Который я мог бы затем использовать как

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

Нет, этот синтаксис недоступен. Лучшее, что вы могли бы сделать, это eval (), который не рекомендуется, особенно если $ e поступал от пользовательского ввода (т. Е. Формы) или оператора switch в каждом случае в качестве случая

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

Это невозможно, но вместо этого вы можете использовать функцию. Конечно, вы должны сами определить их. Это было бы довольно просто с помощью закрытия PHP 5.3:

 $or = function($x, $y) { return $x || $y; }; if ($or($a > $b, $c > $d)) { echo 'yes'; }; 

Для будущих искателей, вот функция, которую я придумал, когда у меня возникло требование добавить некоторые неопределенные и неопределенные «дополнительные критерии» для сужения списка продуктов.

 /** * 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) Вот как я его использовал:

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

Нет, это невозможно.

Неа. нет способа сделать это в php.

Нет, нет способа переопределить операторы (или использовать переменные операторы) в PHP AFAIK.

Если вы не используете eval () , ближайший, о котором я могу думать, это создать функцию:

 function my_operator ($cond1, $cond2) { if ( .... ) return ($cond1 || $cond2); else return ($cond1 && $cond2); } if (my_operator(($a > $b), ($c > $d))) .... 

Вы можете использовать eval, но вы можете легко подвергнуть свой сайт различным атакам инъекций кода, если вы не очень осторожны.

Более безопасным решением было бы совместить предложенный оператор с предопределенным белым списком, а затем вызвать соответствующий бит, если код с жестко закодированным оператором.

C.