在include/require中获取当前方法名


Getting current method name inside include/require

我现在有这个PHP代码;

private function generateSpecialPage(){
        require_once("/view/pages/special.php");
    }

Special.php是一个主要由html填充的php文件。我试图从special.php中获取当前函数的名称。

如果我在require之前回显神奇常数FUNCTION,它会回显"generateSpecialPage",这就是我想要的。但是,如果我从special.php回显FUNCTION,它不会回显任何内容。

我能够使用get_class($this)从special.php内部获得当前类的名称,我想知道是否有一个同样优雅的解决方案用于当前方法。

你可能应该重新组织你的代码,把require_once("/view/pages/special.php")变成一个单独的函数,并传入函数名。

如果你第二次调用generateSpecialPage(),它不会做任何事情。你可以通过将其更改为require()来解决这个问题,但这样你每次都加载文件,这是不必要的。

所需的文件与需要它的函数位于同一作用域中。

因此,您可以在需要文件之前简单地存储到一个变量中:

private function generateSpecialPage() {
    $caller = __FUNCTION__;
    require_once '/view/pages/special.php';
}

那么在special.php中你有一个常规变量$caller:

<?= "required by {$caller}" ?>

一个通用的调用堆栈检查器将允许您回顾以获取调用方函数、类或对象、文件和行。作为框架的一部分,我使用的是这样的:

function caller($offset = 0) {
    return (new 'Exception)->getTrace()[1+$offset];
}

在您的special.php中使用它将产生所需的结果:

<?php echo caller(1)['function']; ?>

此时的调用堆栈是special.php -> require -> doSomethingSpecial,因此我们使用1偏移量跳过require并获得doSomethingSpecial帧。




但是,您可以考虑重构您的视图,让接收参数,而不是让接收环境提示。一个通用的视图加载器应该是这样的:
function render($template, array $params = []) {
   extract($params);
   require $template;
}

,然后有一个模板,看起来像:

<?php echo "Hello {$caller}" ?>

,可以这样调用:

private function doSomethingSpecial() {
    render('special.php', [ 'caller' => __FUNCTION__ ]);
}

我意识到这比期望的类型更多,但从长远来看,它提供了更大的灵活性,因为它将视图与调用者解耦。