用数字评估串联运算符

Evaluate concatonated operator with numbers

我正在为一小段不想自我评估的代码而苦恼:

$t = 5;
$s = "<=";
$r = 6;

var_dump($t.$s.$r);

这里的 var_dump return "5<=6" 是有道理的,但我只是想让它告诉我 如果 5 低于或等于 6 的布尔值.

我想知道除了使用 eval() 或通过所有可能的运算符

的开关之外是否还有其他方法来获取此布尔值

提前致谢。

虽然将代码设为这样(评估存储为明文的代码)通常不是一个好主意,但有一个函数可以做到这一点:eval().

eval() 做您期望 PHP 自然做的事情:评估存储在字符串中的有效代码。

eval("var_dump(".$t.$s.$r.");"); 将完成这项工作 - 但是,由于这些变量中的任何代码都会毫无疑问地执行,因此可能存在安全风险,或者至少会引入一些难以调试的错误。 (需要额外的引号和 ; 才能使 eval 中的代码真正有效 PHP 代码)

如果你想要一个安全灵活的解决方案,这允许你定义一个方法,该方法根据与数组中的键匹配的运算符执行,它只适用于两个操作数,但示例中的最后一个 # 只是将第一个值乘以 4 和 returns 值...

$operators = [ "<=" => function ($a, $b) { return $a <= $b;},
    "<" => function ($a, $b) { return $a < $b;},
    ">=" => function ($a, $b) { return $a >= $b;},
    ">" => function ($a, $b) { return $a > $b;},
    "#" => function ($a) { return $a * 4; }];

$t = 5;
$s = "<=";
$r = 6;
var_dump($operators[$s]($t,$r));

$s = "<";
var_dump($operators[$s]($t,$r));

$s = ">=";
var_dump($operators[$s]($t,$r));

$s = ">";
var_dump($operators[$s]($t,$r));

$s = "#";
var_dump($operators[$s]($t,$r));

给...

/home/nigel/workspace2/Test/t1.php:14:
bool(true)
/home/nigel/workspace2/Test/t1.php:17:
bool(true)
/home/nigel/workspace2/Test/t1.php:20:
bool(false)
/home/nigel/workspace2/Test/t1.php:23:
bool(false)
/home/nigel/workspace2/Test/t1.php:26:
int(20)

有点复杂,但可扩展且安全。