是否可以做这样的事情?
public function something() {
$thisMethodName = method_get_name();
}
method_get_name()
返回方法名称的位置?
答案 0 :(得分:98)
当然,你想要魔术常数。
function myFunction() { print __FUNCTION__." in ".__FILE__." at ".__LINE__."\n"; }
了解详情
答案 1 :(得分:20)
虽然您可以使用magic constant __METHOD__
,但我强烈建议您查看PHP的reflection。 PHP5支持这一点。
$modelReflector = new ReflectionClass(__CLASS__);
$method = $modelReflector->getMethod(__METHOD__);
然后,您可以执行诸如检查签名之类的内容。
答案 2 :(得分:11)
正如smartj建议您可以尝试魔术常量__METHOD__
,但请记住,这将返回一个包含您的类名的字符串,即'MyClass :: something'。
使用__FUNCTION__
代替将返回'某事'。
答案 3 :(得分:2)
使用__FUNCTION__
代替:
public function something() {
$thisMethodName = "something";
}
在以下几个方面存在缺陷:添加变量和内存以将方法名称存储为字符串并复制已存在的内容,从而不必要地添加使用的资源(如果对具有多种方法的大型库执行此操作,则非常重要)。
PHP中的魔术常量保证不会改变,而如果方法名称被更改,这种方法需要适当的编辑,从而引入不一致的可能性(注意,我确实说过潜在的,这意味着它只是一个不必要的编辑如果使用魔法常数而不是)。
命名变量的时间和精力,将方法名称重新键入为分配给该不必要变量的字符串,当然还要正确引用变量名称,这是PHP提供魔术常量开始的动机(并且反驳)任何索赔__FUNCTION__
都是不必要的。)
答案 4 :(得分:1)
Hackish,但您也可以将其从debug_backtrace()返回值中删除。
答案 5 :(得分:0)
有了__FUNCTION__
,我可以使用它:
protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
return array_merge(parent::{__FUNCTION__}($myParam), [
'myValue' => '123'
]);
}
代替此:
protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
return array_merge(parent::getUserResponseByAccessTokenRequestOptions($myParam), [
'myValue' => '123'
]);
}
如果我想更改方法的名称,也不必担心在方法内部替换方法的名称。
答案 6 :(得分:0)
也许以此方式丢失了后期绑定。
当B类扩展到A类时:
__METHOD__
始终返回引用A(A::methodName
)的“ className ::”部分
解决方案是:
static::class."::".__FUNCTION__
通过这种方式,您可以获得对当前工作类(B::methodName
)的类引用
答案 7 :(得分:-6)
你为什么不能这样做?
public function something() {
$thisMethodName = "something";
}