PHP里如何获取函数的调用者名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP里如何获取函数的调用者名称相关的知识,希望对你有一定的参考价值。

先放上来别人的例子吧:
call_user_func函数类似于一种特别的调用函数的方法,使用方法如下:

复制代码 代码如下:

function a($b,$c)

echo $b;
echo $c;

call_user_func('a', "111","222");
call_user_func('a', "333","444");
//显示 111 222 333 444
?>

调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:

复制代码 代码如下:

class a
function b($c)

echo $c;


call_user_func(array("a", "b"),"111");
//显示 111
?>

call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:

复制代码 代码如下:

function a($b, $c)

echo $b;
echo $c;


call_user_func_array('a', array("111", "222"));
//显示 111 222
?>

call_user_func_array函数也可以调用类内部的方法的

复制代码 代码如下:

Class ClassA


function bc($b, $c)
$bc = $b + $c;
echo $bc;


call_user_func_array(array('ClassA','bc'), array("111", "222"));

//显示 333
?>

call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:

复制代码 代码如下:

function a($b)

$b++;

$c = 0;
call_user_func('a', $c);
echo $c;//显示 1
call_user_func_array('a', array($c));
echo $c;//显示 2

另:call_user_func函数和call_user_func_array函数都支持引用。

复制代码 代码如下:

<?php
function increment(&$var)

$var++;

$a = 0;
call_user_func('increment', $a);
echo $a; // 0
call_user_func_array('increment', array(&$a)); // You can use this instead
echo $a; // 1
?>
参考技术A function a() 
    b();

 
function b() 
    $backtrace = debug_backtrace();
    array_shift($backtrace);
    var_dump($backtrace);

 
a();

本回答被提问者和网友采纳

在 C++ (Visual Studio) 中查找函数的调用者

【中文标题】在 C++ (Visual Studio) 中查找函数的调用者【英文标题】:Find caller of function in C++ (Visual Studio) 【发布时间】:2018-01-09 17:49:30 【问题描述】:

我有一个不能在 WinXP 下运行的 Visual Studio 2015 C++ 项目,因为函数 getTickCount64() 在某处被调用(仅 Vista 和更高版本)。该函数位于外部库 Kernel32.dll 中,因此我无法将其声明为已弃用以获取编译器警告。

我检查了很多次,我没有自己调用该函数,它必须在我正在使用的第 3 方库中。

我怎样才能知道函数在哪里被调用?

【问题讨论】:

我觉得你需要调试一下...ericlippert.com/2014/03/05/how-to-debug-small-programs 我会在可执行文件上使用Dependency Walker 来找出答案。 @UKMonkey 缺少依赖项的程序根本不会启动,更不用说可调试了。 @Quentin 正确,但它没有缺少依赖项,dll 存在。 dll中的函数没有,所以运行时会失败。 你应该调试它并在调用该函数时查看调用堆栈。 @UKMonkey:不,它不是特定于应用程序的。当操作系统加载程序尝试加载任何对缺少的 DLL 函数具有静态依赖关系的可执行文件时,它本身会引发该错误。您将没有任何机会调试可执行文件,因为根本没有创建进程。 【参考方案1】:

使用函数断点(Debug->New Breakpoint->Function breakpoint),然后调用堆栈查看它是从哪里调用的。

【讨论】:

只有在应用程序在运行时成功加载时才有效。如果函数是静态链接的,应用将无法加载。 成功加载应用没有问题。我只会在Win7下做!好的,该解决方案对我来说听起来不错,问题是,它不是我正在谈论的简单可执行文件,而是必须加载到数字音频工作站中的 VST 插件(= sound thingy)。所以我必须弄清楚如何调试这些东西......无论如何感谢您的回答!【参考方案2】:

您将无法在运行时使用调试器找到罪魁祸首,因为您的程序将无法在运行时加载。您必须搜索应用程序静态使用的每个 3rd 方库,直到找到静态调用该函数的库。如果您没有库的源代码,您至少可以搜索目标文件或导入与您的应用程序链接的库,查找对该函数的任何引用。

【讨论】:

以上是关于PHP里如何获取函数的调用者名称的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中获取触发器的调用者

如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?

在js中获取作成者

在 C++ (Visual Studio) 中查找函数的调用者

FxCop,组成依赖程序集的调用者列表

如何在laravel routes.php里获取控制器和action名称