2

我正在收集一系列 php 文件并测试以查看单个函数是否返回有效输出。为了简化该过程,它们的所有功能都以相同的名称命名。那么我可以运行:

foreach($fileList as $file) {

    require($file);
    echo $testFunction();

}

问题是 php 抛出错误“无法重新声明函数”,因为第二个文件的函数与第一个文件的函数名称相同。我想要做的是在我测试它的输出后“取消声明”一个函数,但我知道这是不可能的,我正在尝试以程序方式处理这个问题。不幸的是,unlink($file) 不会删除函数的实例。有没有不使用 OOP 方法的简单方法来处理这个问题?

更新#1

使用 exec() 而不是 shell_exec() 可以让我检查错误状态(这是#2)。CHMOD 是必要的,因为用户/组阻止了执行(一旦脚本运行,此离线服务器上的安全设置将被更新)。此时,它不会回显任何内容,因为 shell_exec() 返回错误(至少我认为是这样,因为 shell_exec 的输出为空并且 exec 返回错误 #2)。这是一个更新的测试:

$fileList = array('test.php');
foreach($fileList as $file) {
    // load code from the current file into a $code variable,
    // and append a call to the function held in the $testFunction variable
    $code = file_get_contents($file) . "\n" . 'testFunction();';

    // save this to a temporary file
    file_put_contents('test-file.php', $code);

    // execute the test file in a separate php process,
    // storing the output in the $output variable for examination

    //*************** */
    $output=null;
    $retval=null;
    $absPath = realpath('test-file.php');
    chmod($absPath,0777);
    echo $absPath;
    exec($absPath, $output, $retval);
    echo "Returned with status $retval and output:\n";
    print_r($output);
}

更新#2 虽然你不能取消声明一个函数,但你可以重复地将不同的函数分配给同一个 var。例如:

$listOfFunctionNames = array('function1', 'function2', 'function3);
foreach($listOfFunctionNames as $func) {
     $funxion = $func;
     $funxion();
}
4

1 回答 1

1

您可以在另一个进程中执行文件,例如(假设$testFunction在文件中定义),您可以执行以下操作(假设您在 Linux 上运行):

foreach($fileList as $file) {
    // load code from the current file into a $code variable,
    // and append a call to the function held in the $testFunction variable
    $code = file_get_contents($file) . "\n" . '$testFunction();';

    // save this to a temporary file
    file_put_contents('/tmp/test-file.php', $code);

    // execute the test file in a separate php process,
    // storing the output in the $output variable for examination
    $output = shell_exec('php /tmp/test-file.php');

    // examine output as you wish
}

unlink('/tmp/test-file.php');

编辑:

由于testFunction没有echo,而是返回要检查的输出,我们可以简单地将测试文件修改为echo testFunction();.

$code = file_get_contents($file) . "\n" . 'echo testFunction();'; // <- NOTE: the semi-colon after testFunction();

我注意到我的原始答案在测试文件中缺少分号,这可能是错误的来源。你可以做的是确保它是正确的,让这个脚本生成第一个测试文件并提前终止。然后,您可以从命令行手动检查文件的正确性,并使用 PHP 来确保它是可解析的:

php -l /tmp/test-file.php

另请注意,您可以使用更复杂的方法检查每个测试文件的正确性,但是我试图保持答案简洁,因为这开始偏离一个单独的问题。

于 2022-01-13T23:12:25.593 回答