如何在PHP中运行时创建的函数中访问解析错误?

use*_*690 6 php error-handling lambda

我有这个简单的PHP代码:

<?php

$code = "echo 'Hello World'; }";
call_user_func(create_function('', $code));
Run Code Online (Sandbox Code Playgroud)

如您所见,我的$code语法错误.当我运行这个时,我得到了这个结果:

Parse error: syntax error, unexpected '}' in file.php(4) : runtime-created function on line 1
Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in file.php on line 4
Run Code Online (Sandbox Code Playgroud)

如何将Parse错误变为变量?例如:

$error = some_func_to_get_error();
echo $error;
// Parse error: syntax error, unexpected '}' in file.php(4) : runtime-created function on line 1
Run Code Online (Sandbox Code Playgroud)

use*_*690 3

我花了大约一周的时间研究这个问题,最后我发现了一些有趣的东西。如您所知,有一个名为的 build-it 函数error_get_last 返回有关最后一个错误的信息。在此代码中:

<?php

$code = "echo 'Hello World'; }";
call_user_func(create_function('', $code));
$error = error_get_last();
Run Code Online (Sandbox Code Playgroud)

它会返回类似这样的内容:

Array
(
    [type] => 2
    [message] => call_user_func() expects parameter 1 to be a valid callback, no array or string given
    [file] => file.php
    [line] => 4
)
Run Code Online (Sandbox Code Playgroud)

最后执行时发生错误call_user_func。它需要一个回调,但是,它create_function不能正常工作(因为$code有解析错误)。

但是,当设置自定义错误处理程序return true;,不会call_user_func抛出任何错误,最后一个错误将是运行时创建的函数内的错误。

<?php

// returning true inside the callback
set_error_handler(function () { return true; });

$code = "echo 'Hello World'; }";
call_user_func(create_function('', $code));
$error = error_get_last();
Run Code Online (Sandbox Code Playgroud)

现在错误将是这样的:

Array
(
    [type] => 4
    [message] => syntax error, unexpected '}'
    [file] => file.php(7) : runtime-created function
    [line] => 1
)
Run Code Online (Sandbox Code Playgroud)

  • 有趣的方法。确保在创建匿名函数后恢复原始错误处理程序。否则你将影响所有后续的错误处理。 (2认同)