我正在寻找一种让我的异常处理程序转储引发异常的函数的局部变量的方法。这可能吗?
答案 0 :(得分:7)
get_defined_vars()
将返回所有已定义变量的数组。然后,您可以循环遍历每个内容并转储内容,或使用var_dump( get_defined_vars() )
将它们全部转储。
答案 1 :(得分:2)
试试var_dump( get_defined_vars( ) );
。这应该将所有已定义的变量转储到范围内。
答案 2 :(得分:2)
我认为更好的是设置xDebug。
它会自动转储所有环境。每次都会得到类似的内容:
Catchable fatal error: Argument 1 passed to RogoDeal::getDealerForMe() must be an instance of RogoParticipant, instance of myUser given in G:\webroot\v1-1-5.omyconf\lib\model\doctrine\RogoDeal.class.php on line 512
Call Stack:
0.0002 336944 1. {main}() G:\webroot\v1-1-5.omyconf\web\frontend_dev.php:0
0.1244 1983360 2. sfContext->dispatch() G:\webroot\v1-1-5.omyconf\web\frontend_dev.php:13
0.1244 1983392 3. sfFrontWebController->dispatch() G:\webroot\symfony\lib\util\sfContext.class.php:170
0.1248 1987104 4. sfController->forward() G:\webroot\symfony\lib\controller\sfFrontWebController.class.php:48
0.1500 2085896 5. sfFilterChain->execute() G:\webroot\symfony\lib\controller\sfController.class.php:238
0.1504 2086752 6. sfRenderingFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
0.1504 2086752 7. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfRenderingFilter.class.php:33
0.1508 2087584 8. sfBasicSecurityFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
0.1512 2087584 9. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfBasicSecurityFilter.class.php:72
0.1515 2088408 10. sfCacheFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
0.1549 2089920 11. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfCacheFilter.class.php:65
0.1553 2090744 12. sfExecutionFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
14.8569 19778472 13. sfExecutionFilter->handleView() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:47
14.8570 19778472 14. sfExecutionFilter->executeView() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:116
14.8662 19806016 15. sfPHPView->render() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:155
14.8673 19806352 16. sfPHPView->renderFile() G:\webroot\symfony\lib\view\sfPHPView.class.php:185
14.8801 19926728 17. require('G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php') G:\webroot\symfony\lib\view\sfPHPView.class.php:75
16.2403 21796104 18. sfOutputEscaperIteratorDecorator->getDealerForMe() G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php:48
16.2403 21796304 19. sfOutputEscaperObjectDecorator->__call() G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php:48
16.2404 21796552 20. call_user_func_array() G:\webroot\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php:64
16.2404 21796736 21. RogoDeal->getDealerForMe() G:\webroot\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php:64
Dump $_SERVER
$_SERVER['REQUEST_METHOD'] = 'GET'
$_SERVER['REQUEST_URI'] = '/frontend_dev.php/program/marked?interface=mobile'
$_SERVER['HTTP_USER_AGENT'] = 'Opera/9.80 (Windows NT 6.1; U; Edition Ukraine Local; ru) Presto/2.10.229 Version/11.60'
Dump $_REQUEST
$_REQUEST['interface'] = 'mobile'
Variables in local scope (#21):
$dealer = *uninitialized*
$me = *uninitialized*
$owner = *uninitialized*
它使调试非常容易。
答案 3 :(得分:2)
异常处理程序永远不会访问异常引发的函数的局部变量,因为这些变量是本地的。我认为没有办法从userland PHP代码获取对特定堆栈帧的变量表的访问权。
您可以使用xdebug作为步调试器来执行此操作。使用断点(例如在异常处理程序中),您可以查看每个堆栈帧。
在步骤调试旁边,还有一些您可能想要使用的显示选项,例如:
答案 4 :(得分:2)
您可以访问局部变量,如果异常将在相同的范围/函数中捕获,则抛出它:
<?php
try
{
$var = 123;
throw new Exception();
}
catch (Exception $e)
{
var_dump($var); // int(123)
}
?>
答案 5 :(得分:0)
您可以通过调用函数 get_defined_vars 来全部定义(包括预定义)。
如果没有一些调试工具,就无法使用局部变量(当前函数的范围)。