以下代码:
<?php
function e($m, $n) {
return eval(
'return new class() {
// '. str_repeat('a', $m). '
public function test() {
return "'. $n. '";
}
};'
);
}
for ($i = 131; $i < 140; $i++) {
echo $i. ': '. e($i, 1)->test(). ', '. e($i, 2)->test(). ', '. e($i, 1)->test(). ', '. e($i, 2)->test(). ', '. e($i + 1, 1)->test(). ', '. e($i + 1, 2)->test(). "\n";
}
当使用 php 7.4 或 8.* 运行时,它会打印
131: 1, 2, 1, 2, 1, 2
132: 1, 2, 1, 2, 1, 2
133: 1, 2, 1, 2, 1, 2
134: 1, 2, 1, 2, 1, 2
135: 1, 2, 1, 2, 1, 2
136: 1, 2, 1, 2, 1, 2
137: 1, 2, 1, 2, 1, 2
138: 1, 2, 1, 2, 1, 2
139: 1, 2, 1, 2, 1, 2
这是预期的。当使用 php 7.3 - 7.0 运行时,它会打印
131: 1, 2, 2, 2, 1, 1
132: 1, 1, 1, 1, 1, 2
133: 1, 2, 1, 2, 1, 2
134: 1, 2, 1, 2, 1, 2
135: 1, 2, 1, 2, 1, 1
136: 1, 1, 1, 1, 1, 1
137: 1, 1, 1, 1, 1, 1
138: 1, 1, 1, 1, 1, 1
139: 1, 1, 1, 1, 1, 1
这是非常出乎意料的。我还没有找到解决方法,但我真的需要一个!
最初似乎是评估代码开头的字符数相同,但当代码更复杂时,情况就不再是这样了。
请帮忙!
我不确定是什么导致了你的问题,但是如果可能的话,必须避免使用
eval()
,这里是可能的:
<?php
class MyTestClass {
private $n;
private $m;
public function __construct($m, $n) {
$this->m = str_repeat('a', $m);
$this->n = $n;
}
public function test() {
return $this->n;
}
}
function evalClass($m, $n) {
return new MyTestClass($m, $n);
}
for ($i = 131; $i < 140; $i++) {
echo $i. ': '. evalClass($i, 1)->test(). ', '. evalClass($i, 2)->test(). ', '. evalClass($i, 1)->test(). ', '. evalClass($i, 2)->test(). ', '. evalClass($i + 1, 1)->test(). ', '. evalClass($i + 1, 2)->test(). "\n";
}
输出:
131: 1, 2, 1, 2, 1, 2
132: 1, 2, 1, 2, 1, 2
133: 1, 2, 1, 2, 1, 2
134: 1, 2, 1, 2, 1, 2
135: 1, 2, 1, 2, 1, 2
136: 1, 2, 1, 2, 1, 2
137: 1, 2, 1, 2, 1, 2
138: 1, 2, 1, 2, 1, 2
139: 1, 2, 1, 2, 1, 2