使用变量作为运算符

时间:2010-02-14 23:33:06

标签: php

所以我有以下内容:

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

我运行比较

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

一切正常。是否可以使用变量代替运算符? 类似的东西:

$e = ||;

然后我可以将其用作

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

10 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:4)

对于未来的搜索者来说,这是我提出的一项功能,当我需要添加一些模糊和未定义的“附加条件”来缩小产品列表时。

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

(编辑)以下是我如何使用它:

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

答案 3 :(得分:1)

不,这是不可能的。

答案 4 :(得分:1)

没了。在php中无法做到这一点。

答案 5 :(得分:1)

请使用此代码更改字符串运算符以转换为实际格式

 <?php

  $a = 3;
  $b = 4;
  $c = 5;
  $d = 6;
  $e='&&';
  $lt='<';
  $gt='>';

  if(eval('return '.$a.$lt.$b.$e.$c.$gt.$d.';')){
    echo "yes";
  }else{
    echo "No";
  }

答案 6 :(得分:0)

不,没有办法在PHP AFAIK中重新定义运算符(或使用变量运算符)。

没有使用eval(),我能想到的最接近的是创建一个函数:

function my_operator ($cond1, $cond2)
 {
   if ( ....  ) 
     return ($cond1 || $cond2);
   else
     return ($cond1 && $cond2);

 }

if (my_operator(($a > $b), ($c > $d)))
 ....

答案 7 :(得分:0)

您可以使用eval,但是如果您不是非常小心的话,您可能很容易将您的网站暴露给各种代码注入攻击。

更安全的解决方案是将建议的运算符与预定义的白名单进行匹配,然后在运算符硬编码的代码中调用相应的位。

下进行。

答案 8 :(得分:0)

 public function checkOperator($value1, $operator, $value2)
    {
        switch ($operator) {
            case '%': // Percentage
                return $value1 % $value2;
            case '+': // Sum
                return $value1 + $value2;
            case '-': // subtraction
                return $value1 - $value2;
            case '*': // Multiplication
                return $value1 * $value2;
            case '/': // Divided
                return $value1 / $value2;
            case '': // Greater than
                return $value1 > $value2;
            case '>=': // Greater than or equal to
                return $value1 >= $value2;
            case '==': // Equal
                return $value1 == $value2;
            case '===': // Identical
                return $value1 === $value2;
            case '!==': // Not Identical
                return $value1 !== $value2;
            case '!=': // Not equal
            case '': // Not equal
                return $value1 != $value2;
            case '||': // Or
            case 'or': // Or
                return $value1 || $value2;
            case '&&': // And
            case 'and': // And
                return $value1 && $value2;
            case 'xor': // Or
                return $value1 xor $value2;
            default:
                return false;
        }
    }

答案 9 :(得分:0)

如果您 使用任意用户输入或可以

eval在这种情况下使用通常是完全合法的白名单简单的数学表达式:

/

编写自己的math parser很有趣。但是在脚本语言的上下文中还是有一些误导,因为脚本语言始终是内置功能。<​​/ p>