我现在有这个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__ ]);
}
我意识到这比期望的类型更多,但从长远来看,它提供了更大的灵活性,因为它将视图与调用者解耦。