php 中 eval 的意外行为 < 7.4

问题描述 投票:0回答:1

以下代码:

<?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

这是非常出乎意料的。我还没有找到解决方法,但我真的需要一个!

最初似乎是评估代码开头的字符数相同,但当代码更复杂时,情况就不再是这样了。

请帮忙!

php eval behavior
1个回答
0
投票

我不确定是什么导致了你的问题,但是如果可能的话,必须避免使用

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
© www.soinside.com 2019 - 2024. All rights reserved.