Использование переменной в качестве оператора
Итак, у меня есть что-то вроде следующего:
$a = 3;
$b = 4;
$c = 5;
$d = 6;
и я выполняю сравнение, подобное
if($a>$b || $c>$d) { echo 'yes'; };
Все работает отлично. Можно ли использовать переменную вместо оператора?
Что-то вроде:
$e = ||;
Что я мог бы использовать как
if($a>$b $e $c>$d) { echo 'yes'; };
Ответы
Ответ 1
Нет, этот синтаксис недоступен. Лучшее, что вы могли бы сделать, это eval(), который не рекомендуется, особенно если $e поступал от пользовательского ввода (т.е. Формы) или оператора switch с каждым оператором в качестве случая
switch($e)
{
case "||":
if($a>$b || $c>$d)
echo 'yes';
break;
}
Ответ 2
Это невозможно, но вместо этого вы можете использовать функцию. Конечно, вы должны сами определить их. Это было бы довольно просто, используя закрытие PHP 5.3:
$or = function($x, $y)
{
return $x || $y;
};
if ($or($a > $b, $c > $d))
{
echo 'yes';
};
Ответ 3
Для будущих поисковиков, здесь была функция, с которой я столкнулся, когда у меня было требование добавить некоторые неопределенные и undefined "дополнительные критерии" для сужения списка продуктов.
/**
* 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;
}
}
Ответ 4
Нет, это невозможно.
Ответ 5
Нету. нет способа сделать это в php.
Ответ 6
Нет, нет способа переопределить операторы (или использовать переменные операторы) в PHP AFAIK.
За исключением использования eval(), самое близкое, что я могу представить, это создать функцию:
function my_operator ($cond1, $cond2)
{
if ( .... )
return ($cond1 || $cond2);
else
return ($cond1 && $cond2);
}
if (my_operator(($a > $b), ($c > $d)))
....
Ответ 7
Вы можете использовать eval, но вы можете легко в конечном итоге подвергнуть ваш сайт различным видам инъекций кода, если вы не очень осторожны.
Более безопасное решение должно соответствовать предлагаемому оператору в отношении предопределенного белого списка, а затем вызвать соответствующий бит, если код с жестко закодированным оператором.
С.