Подтвердить что ты не робот

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

Итак, у меня есть что-то вроде следующего:

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

и я выполняю сравнение, подобное

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

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

$e = ||;

Что я мог бы использовать как

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

Ответ 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, но вы можете легко в конечном итоге подвергнуть ваш сайт различным видам инъекций кода, если вы не очень осторожны.

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

С.