【问题标题】:Getting current method name inside include/require在 include/require 中获取当前方法名称
【发布时间】:2016-11-01 00:43:25
【问题描述】:

我目前有这个 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 中获取当前类的名称,我想知道当前方法是否有同样优雅的解决方案。

【问题讨论】:

  • 更好的问题:为什么?你的代码不需要关心它运行的函数。如果是这样,你是在故意将未来的错误放入其中,并在代码库需要重定位或页面重写时阻止任何未来易于维护的代码库。
  • 我更改了函数/页面的名称并删除了与我的问题无关的行,所以这可能会导致混淆。我有大约 15 个类似的其他函数,它们都使用“special.php”作为视图。它关心它运行在什么函数中的原因是因为“special.php”的每个实现都会导致页面略有不同,用户交互也略有不同。我不想为每个细微的变化创建一个新视图;管理起来将是一场噩梦。我宁愿使用函数名,也不愿在每个函数或类本身中声明/分配一个变量。
  • 这听起来像“当你只有一把锤子时,每个问题看起来都像钉子”。不要在 15 个不同的函数中包含“special.php”,而是在每个函数中神奇地做不同的事情,让“special.php”be 成为一个函数,您可以包含该代码,然后调用为 @ 987654322@ 这样您就可以在一个单一、明显、易于记录、易于调试、易于维护的地方进行切换。

标签: php


【解决方案1】:

您可能应该重新组织您的代码,将require_once("/view/pages/special.php") 更改为单独的函数并传入函数名称。

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

【讨论】:

    【解决方案2】:

    所需文件与需要它的函数位于同一范围内。

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

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

    然后在special.php 中你有一个常规变量$caller

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

    【讨论】:

      【解决方案3】:

      通用调用堆栈检查器可让您回顾以获取调用者函数、类或对象、文件和行。我用作框架一部分的那个本质上看起来像:

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

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

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

      此时的调用堆栈为special.php -&gt; require -&gt; 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__ ]);
      }
      

      我意识到这比预期的要多,但从长远来看,它提供了更大的灵活性,因为它将视图与调用者分离。

      【讨论】:

        猜你喜欢
        • 2016-03-13
        • 1970-01-01
        • 2011-01-04
        • 2010-09-19
        • 2010-10-01
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        相关资源
        最近更新 更多