我想知道调用全局函数或公共方法的位置。我想我可以通过检查debug_backtrace来做到这一点但我宁愿使用更轻量级的机制(如果存在的话)。有什么建议吗?
例如,如果你想象get_callee()函数和常量存在:
function doSomething() {
if(get_callee() == 'PHP_GLOBAL') { throw new IllegalAccessException(); }
...
}
答案 0 :(得分:4)
编辑:抱歉,现在看到有关debug_backtrace()的说明。
有点难看但是嘿,如果你需要这样做,那就错了。
魔术在get_callee()函数和debug_backtrace()中。是的,如果你必须使用它,请添加一些错误检查。
<?php
init();
function foo()
{
echo 'bar called from ' . get_callee() . '<br />';
bar();
}
function bar()
{
echo 'foo called from ' . get_callee() . '<br />';
}
function init()
{
echo 'init.. <br />';
foo();
}
function get_callee()
{
$backtrace = debug_backtrace();
return $backtrace[1]['function'];
}
<强>输出:强>
初始化..
来自foo的栏
foo从酒吧打来
答案 1 :(得分:2)
为什么不简单地使用OO并将您的方法/函数声明为私有?
如果你开始在你的代码中撒上那些get_callee(),你就会创造一个可怕的kludge。
答案 2 :(得分:1)
Xdebug提供了一些不错的功能。
<?php
Class MyClass
{
function __construct(){
$this->callee();
}
function callee() {
echo sprintf("callee() called @ %s: %s from %s::%s",
xdebug_call_file(),
xdebug_call_line(),
xdebug_call_class(),
xdebug_call_function()
);
}
}
$rollDebug = new MyClass();
?>
将返回跟踪
callee() called @ /var/www/xd.php: 16 from MyClass::__construct
要在ubuntu上安装Xdebug,最好的方法是
sudo aptitude install php5-xdebug
您可能需要先安装php5-dev
sudo aptitude install php5-dev