所以我有以下内容:
$a = 3;
$b = 4;
$c = 5;
$d = 6;
我运行比较
if($a>$b || $c>$d) { echo 'yes'; };
一切正常。是否可以使用变量代替运算符? 类似的东西:
$e = ||;
然后我可以将其用作
if($a>$b $e $c>$d) { echo 'yes'; };
答案 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>