是否可以在析构函数中获取被调用的函数名称?
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
答案 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
用于静态函数。