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里如何获取函数的调用者名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?