使用变量作为运算符

Jas*_*son 28 php

所以我有以下内容:

$a = 3;
$b = 4;
$c = 5;
$d = 6;
Run Code Online (Sandbox Code Playgroud)

我做了一个比较

if($a>$b || $c>$d) { echo 'yes'; };
Run Code Online (Sandbox Code Playgroud)

一切正常.是否可以使用变量代替运算符?就像是:

$e = ||;
Run Code Online (Sandbox Code Playgroud)

我可以用它作为

if($a>$b $e $c>$d) { echo 'yes'; };
Run Code Online (Sandbox Code Playgroud)

Kri*_*her 23

不,该语法不可用.您可以做的最好的是eval(),这是不推荐的,特别是如果$ e来自用户输入(即表单),或者每个运算符作为一个case的switch语句

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


Wil*_*den 12

这是不可能的,但你可以使用一个函数.当然,你必须自己定义它们.使用PHP 5.3的闭包这将非常简单:

$or = function($x, $y)
{
    return $x || $y;
};

if ($or($a > $b, $c > $d))
{
    echo 'yes';
};
Run Code Online (Sandbox Code Playgroud)


Ixa*_*ida 6

对于将来的搜索者,当我需要添加一些模糊且未定义的“附加条件”以缩小产品范围时,我想到了这个功能。

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

(编辑)这是我的用法:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)