获取当前方法名称include / require

时间:2016-11-01 00:43:26

标签: php

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

3 个答案:

答案 0 :(得分:0)

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

如果您再次拨打generateSpecialPage(),则不会执行任何操作。您可以通过将其更改为require()来解决此问题,但之后您每次都在加载文件,这是不必要的。

答案 1 :(得分:0)

通用调用堆栈检查器将让您回顾一下获取调用者函数,类或对象,文件和行。我用作框架的一部分看起来就像:

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__ ]);
}

我意识到这种打字比想要的更多,但它在长期内提供了更大的灵活性,因为它将视图与调用者分离。

答案 2 :(得分:0)

所需文件与所需文件的作用范围相同。

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

'use strict';

angular.module("home", ['ui.router', 'home.controllers', 'urlLanguageStorage', 'pascalprecht.translate', 'ui.bootstrap', 'ngStorage'])

.config(['$stateProvider', '$translateProvider', '$urlRouterProvider',
    function($stateProvider, $translateProvider, $urlRouterProvider) {

        $translateProvider.useUrlLoader("home/mensajes");
        $translateProvider.useStorage("UrlLanguageStorage");
        $translateProvider.preferredLanguage("en");
        $translateProvider.fallbackLanguage("en");

        $stateProvider
            .state("home", {
                url: "/",
                templateUrl: "resources/js/home/views/home/home.html",
                controller: "HomeController"
            });

        $stateProvider
            .state("contacto", {
                url: "/contacto",
                templateUrl: "resources/js/home/views/contact/contac.html",
                controller: "HomeController"
            });
    }
])

.run(['$localStorage', '$http', function($localStorage, $http) {

    if ($localStorage.token) {
        $http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.token;
    }
}]);

然后在private function generateSpecialPage() { $caller = __FUNCTION__; require_once '/view/pages/special.php'; } 中你有一个常规变量special.php

$caller