用数字评估串联运算符
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)
有点复杂,但可扩展且安全。
我正在为一小段不想自我评估的代码而苦恼:
$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)
有点复杂,但可扩展且安全。