在析构函数中获取被调用的函数名称

时间:2013-03-23 09:52:47

标签: php class

是否可以在析构函数中获取被调用的函数名称?

class My_class {

    function my_func() {
        echo 'Hii';
    }

    function your_func() {
        echo 'Hii';
    }

    function __destruct() {
        echo $the_called_func_name;
    }
}


$bar = new my_class();
$bar->my_func();

是否可以在析构函数中获取名称“my_func”?

如果我们使用

echo __FUNCTION__;

它会给出

__destruct

我想要

my_func

3 个答案:

答案 0 :(得分:2)

是的,这是可能的。由于my_func是动态的,你可以使用函数重载(a.k.a魔术方法)__call()

class My_Class
{

   private $methods = array(); 


   public function __call($method, array $args)
   {
      array_push($this->methods, $method);
   }

   public function getMethods()
   {
      return $this->methods;
   }

   public function __destruct()
   {
      // Off course, you should improve this 
      print_r($this->getMethods());
   }
}

// Usage:

$foo = new My_Class();
$foo->my_func(); // Output Array(0 => 'my_func')

答案 1 :(得分:1)

  

仅用于记录已加入的功能。而不是在每个函数中调用日志函数。

如果不向方法添加代码或使用单独的工具进行调试和分析,这是不可能的。

请注意,使用__call的建议解决方案不适用于现有的公共方法,最终会比仅为每个方法添加log(__METHOD__)更复杂。

您正在寻找的基本上是Aspect Oriented Programming (AOP),这在PHP中并不十分支持。框架Flow3使用注释和反射来动态添加方面。他们的Logging Example是您用例的完美例证:

namespace Example\MyPackage;

/**
 * A logging aspect
 *
 * @Flow\Aspect
 */
class LoggingAspect {

        /**
         * @var \TYPO3\Flow\Log\LoggerInterface A logger implementation
         */
        protected $logger;

        /**
         * For logging we need a logger, which we will get injected automatically by
         * the Object Manager
         *
         * @param \TYPO3\Flow\Log\SystemLoggerInterface $logger The System Logger
         * @return void
         */
        public function injectSystemLogger(\TYPO3\Flow\Log\SystemLoggerInterface ⏎
                $systemLogger) {
                $this->logger = $systemLogger;
        }

        /**
         * Before advice, logs all access to public methods of our package
         *
         * @param  \TYPO3\Flow\AOP\JoinPointInterface $joinPoint: The current join point
         * @return void
         * @Flow\Before("method(public Example\MyPackage\.*->.*())")
         */
        public function logMethodExecution(\TYPO3\Flow\AOP\JoinPointInterface $joinPoint) {
                $logMessage = 'The method ' . $joinPoint->getMethodName() . ' in class ' .
                        $joinPoint->getClassName() . ' has been called.';
                $this->logger->log($logMessage);
        }
}

重要的一点是:

@Flow\Before("method(public Example\MyPackage\.*->.*())")

它告诉框架在logMethodExecution命名空间的任何类中调用任何方法之前调用Example\MyPackage

所以,使用 Flow3 ,你可以做到。但是在没有AOP框架的情况下自己实现类似的行为肯定会失败。

答案 2 :(得分:0)

是,

class My_class {

    function my_func() {
        echo 'Hii';
    }

    function your_func() {
        echo 'Hii';
    }

    function __destruct() {
        self::my_func();
        // my_func called
    }
}


$bar = new my_class();
$bar->my_func();

如果您指的是函数名称,请将__call用于对象函数,将__callStatic用于静态函数。