Поэтому у меня есть что-то вроде следующего:
$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.