1

真的很简单的问题。我遇到了一个工作问题,将 >= <= 和 == 存储到一个变量中以便在任何情况下都吐出某些 if 语句是理想的。

$numb1 = 5
$numb2 = 10
$option = >=

if($numb1 $option $numb2)
4

4 回答 4

1

并非没有使用eval()通常被认为是一个坏主意

于 2013-02-14T01:55:15.673 回答
1

直接这样做,只能使用eval() - 使用 eval 不被认为是好的做法。主要问题是如果 eval() 语句接受用户输入,则用户可以将 php 注入您的代码中。这显然很糟糕。请参阅此线程- php 中的 eval 何时是邪恶的?

你最好做的是为所有各种操作创建一系列 switch 语句,例如“大于”、“小于”、“等于”等等......

于 2013-02-14T01:59:42.547 回答
1

对此最好的做法是进行函数调用或对象包装,然后调用该函数以达到相同的结果。

例子:

$func = '__my_eq_op_';


if ($func($numb1,$numb2)) {
  // Do stuff
}

然后操作员函数...

function __my_eq_op($a,$b) {
  return $a == $b;
}

function __my_gte_op($a,$b) {
  return $a >= $b;
}

function __my_lte_op($a,$b) {
  return $a <= $b;
}

例如。所以你真的可以把它分解成使用函数。

为了这:

如果 ($x == $y)

解析器看到 6 个标记... 1) KEYWORD IF: 2) LPAREN 3) VAR X 4) EQ 5) VAR Y 6) RPAREN

解析器使用这些标记为 IF 条件构造 AST。您的想法需要远离将“==”视为变量。是运营商!

于 2013-02-14T02:06:14.223 回答
1

您不能在控制指令中放置一个 var 来测试它。这将返回一些:syntax error, unexpected T_VARIABLE

您可以使用一些 eval() 来执行此操作,但不建议这样做。

也许您可以通过以下方式做出不同的事情:

$option=$_GET['option']; // or POST or something else...
$numb1 = 5;
$numb2 = 10;

switch($option) {
 case ">=":
    if($numb1 >= $numb2){//someting}
    break;
 case "<=":
    if($numb1 <= $numb2){//someting}
    break;
 case "==":
    if($numb1 == $numb2){//someting}
    break;
 default://something else if there is no $option
    break;
}

或使用如下功能

function testVar($numb1,$numb2,$option)
{
   // Same switch
}
于 2013-02-14T02:10:00.050 回答