您可以从 PHP 中的方法中获取方法名称吗?

     2023-02-23     192

关键词:

【中文标题】您可以从 PHP 中的方法中获取方法名称吗?【英文标题】:Can you get a method name from within a method in PHP? 【发布时间】:2010-11-28 07:58:42 【问题描述】:

有可能做这样的事情吗?

public function something() 
    $thisMethodName = method_get_name(); 

method_get_name() 在哪里返回方法的名称?

【问题讨论】:

【参考方案1】:

当然,你想要魔法常数。

function myFunction()  print __FUNCTION__." in ".__FILE__." at ".__LINE__."\n"; 

通过the php manual了解更多信息

【讨论】:

顺便说一句,方法名的神奇常数是:__METHOD__ 游戏迟到了,但我惊讶地发现__METHOD__ 实际上返回Class::method 所以__FUNCTION__ 专门返回方法名称......对于其他任何仍然 RTFM 不喜欢我。【参考方案2】:

虽然您可以使用 magic constant __METHOD__,但我强烈建议您查看 PHP 的 reflection。 PHP5 支持此功能。

$modelReflector = new ReflectionClass(__CLASS__);
$method = $modelReflector->getMethod(__METHOD__);

然后你就可以做一些诸如检查签名之类的事情了。

【讨论】:

当您说“检查签名”时,您是指这个吗? php.net/manual/en/function.openssl-verify.php @MrMe 不,这样的方法签名(不要与身份验证签名混淆):en.wikipedia.org/wiki/Type_signature 哦,好吧,基本上是类型提示***.com/questions/2161040/… 谢谢!【参考方案3】:

正如 smartj 建议的那样,您可以尝试使用魔术常量 __METHOD__,但请记住,这将返回一个包含您的类名的字符串,即“MyClass::something”。 改用__FUNCTION__ 将返回“某物”。

【讨论】:

【参考方案4】:

使用__FUNCTION__ 是要走的路,而不是:

 public function something() 
     $thisMethodName = "something";
 

这在几个方面存在缺陷,添加变量和内存以将方法名称存储为字符串并复制已经存在的内容,因此不必要地添加使用的资源,(如果您为具有许多方法的大型库执行此操作,则非常重要)。

保证 PHP 中的魔术常量不会更改,而如果方法名称发生更改,这种方法将需要进行适当的编辑,从而引入不一致的可能性(注意,我确实说过潜在的,这意味着它只是一个不必要的编辑如果改为使用魔法常数)。

命名变量所花费的时间和精力,将方法名称重新键入为分配给该不必要变量的字符串,当然还要正确引用变量名称,这是 PHP 提供魔术常量开头的动机(并反驳任何声明__FUNCTION__ 都是不必要的)。

【讨论】:

【参考方案5】:

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

如果我想更改它,也不关心替换方法内部的方法名称。

【讨论】:

这是一个很好的参考,也适用于self::self::$some_method_name(); :-) 它的文档在哪里? (我知道这些年来我在某个地方见过它,只是不记得它的确切名称)(一般我知道它是Variable functionsVariable variables 的组合)【参考方案6】:

Hackish,但您也可以从 debug_backtrace() 返回值中挖掘出来。

【讨论】:

如果您有一个通用的日志记录函数需要调用它的函数的名称,这可能是可行的方法。【参考方案7】:

可能以这种方式缺少后期绑定。

当 B 类扩展 A 类时:

__METHOD__ 始终返回引用 A 的“className::”部分 (A::methodName)

解决办法是:

static::class."::".__FUNCTION__

通过这种方式,您可以获得当前工作类的类引用(B::methodName

【讨论】:

【参考方案8】:

你为什么不能这样做?

public function something() 
    $thisMethodName = "something";

【讨论】:

__FUNCTION__ 可用时完全不需要。 很公平 - 但本着同样的精神,我可以满足于 `__FUNCTION__ 是不必要的:) 如果方法收到新名称很危险,开发人员可能会忘记更新 var 内容

是否可以从布局中获取视图名称?

】是否可以从布局中获取视图名称?【英文标题】:IsitpossibletogettheViewnamefromwithinLayout?【发布时间】:2016-03-1507:33:16【问题描述】:我正在尝试从我的布局中提取当前视图的名称。通常,VirtualPath用于此目的。不幸的是,这将返... 查看详情

您可以从类中获取实例变量名称吗? [复制]

】您可以从类中获取实例变量名称吗?[复制]【英文标题】:Canyougettheinstancevariablenamefromaclass?[duplicate]【发布时间】:2015-08-2305:00:57【问题描述】:我知道你不应该在程序中使用变量名,但我使用的只是为了调试目的,并希望将... 查看详情

有啥方法可以首先获取参数,最后在球拍中的函数中获取名称?

】有啥方法可以首先获取参数,最后在球拍中的函数中获取名称?【英文标题】:Isthereanywaytotakeatfirsttheargumentsandatlastthenameinafunctioninracket?有什么方法可以首先获取参数,最后在球拍中的函数中获取名称?【发布时间】:2021-05-10... 查看详情

如何获取调用COM服务器方法的用户名?

...编写的COM服务器,在网络中的某台计算机上运行。客户端可以从其他计算机对其执行远程调用。我可以确定从方法本身调用COM方法的用户的名称吗?【问题讨论】:【参考方案1】:您可以通过在COM方法中调用CoI 查看详情

当猴子修补实例方法时,您可以从新实现中调用覆盖的方法吗?

】当猴子修补实例方法时,您可以从新实现中调用覆盖的方法吗?【英文标题】:Whenmonkeypatchinganinstancemethod,canyoucalltheoverriddenmethodfromthenewimplementation?【发布时间】:2011-05-2702:05:59【问题描述】:假设我正在修补类中的方法,我... 查看详情

在 Vue 中,您可以从方法中调用 created() 函数吗?

】在Vue中,您可以从方法中调用created()函数吗?【英文标题】:InVuecanyoucallthecreated()functionfromamethod?【发布时间】:2019-06-0613:32:45【问题描述】:所以我在vue中制作了一个应用程序,在页面加载时,它需要一个带有用户zip的cookie... 查看详情

我可以根据雪花中的模式名称获取数据库名称吗

】我可以根据雪花中的模式名称获取数据库名称吗【英文标题】:Canigetdatabasenamewithrespecttoschemanameinsnowflake【发布时间】:2020-03-2313:07:06【问题描述】:您好,我正在尝试通过在雪花中指定模式的名称来查找数据库的名称【问题... 查看详情

是否有一种内置方法可以从 PHP 中的多暗淡数组中获取数组?

】是否有一种内置方法可以从PHP中的多暗淡数组中获取数组?【英文标题】:IsthereabuiltinwaytogetanarrayoutofmultidimarrayinPHP?【发布时间】:2011-01-1314:09:59【问题描述】:(查询数据库时非常有用)。如果我有一个多暗数组[[\'id\'=>1]... 查看详情

我们可以从套接字地址中获取应用程序名称吗?

】我们可以从套接字地址中获取应用程序名称吗?【英文标题】:Canwegettheapplicationnamefromthesocketaddress?【发布时间】:2017-07-0510:11:13【问题描述】:我们能否找到在给定套接字地址上运行的应用程序的名称?套接字地址是指IP地... 查看详情

从 Hashmap put() 中获取调用方法名称的列表

】从Hashmapput()中获取调用方法名称的列表【英文标题】:Getthelistofinvokingmethodname\'sfromHashmapput()【发布时间】:2020-07-3121:08:52【问题描述】:您能帮我从HashMapput方法中获取列表方法名称吗?Bookbook=newBook();book.setTitle("TheLittlePrince");... 查看详情

如何从 Cocoa 中的应用程序名称中获取 Bundle Identifier?

】如何从Cocoa中的应用程序名称中获取BundleIdentifier?【英文标题】:HowdoyougettheBundleIdentifierfromanapplication\'snameinCocoa?【发布时间】:2012-02-2306:38:05【问题描述】:假设您有一个应用程序的名称Mail.app,您如何以编程方式从应用程... 查看详情

我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?

】我可以从ELF文件的符号表中的符号信息中获取对象名称吗?【英文标题】:CanIgetobjectnamefromasymbolinformationinthesymboltableinanELFfile?【发布时间】:2011-08-0812:03:24【问题描述】:我已经成功解析了一个从多个源文件编译的elf文件(... 查看详情

我可以知道调用jnic方法的类的名称吗?(代码片段)

有什么方法可以知道在JNIC代码中调用方法的类的名称吗?我可以使用以下语句获取对该类的引用:jclasscls=(*env)->GetObjectClass(env,obj);但有什么方法可以知道班级的名字吗?。答案此代码将为您提供调用类名称:jclasscls=env->GetOb... 查看详情

从照片库中获取图像名称

...IImagePicker。现在我正在从照片库中检索图像。有什么方法可以从照片库中检索图像的名称吗?尝试了UIImagePicker方法,但找不到。任何人..?谢谢..【问题讨论】:不,没有办法获取图片名,只能获取图片。【参考方案1】:图像选... 查看详情

您可以从 SqlDataReader 获取列名吗?

】您可以从SqlDataReader获取列名吗?【英文标题】:CanyougetthecolumnnamesfromaSqlDataReader?【发布时间】:2009-03-2513:43:31【问题描述】:连接数据库后,能否获取我的SqlDataReader中返回的所有列的名称?【问题讨论】:【参考方案1】:var... 查看详情

我的应用程序有啥方法可以从 Apple Maps 应用程序中获取书签列表吗?

】我的应用程序有啥方法可以从AppleMaps应用程序中获取书签列表吗?【英文标题】:IsthereanywayformyApptogetthelistofbookmarksfromtheAppleMapsapp?我的应用程序有什么方法可以从AppleMaps应用程序中获取书签列表吗?【发布时间】:2014-01-1114:5... 查看详情

从意图活动访问片段方法(代码片段)

...mentation:片段表示活动中的行为或用户界面的一部分。您可以在单个活动中组合多个片段以构建多窗格UI,并在多个活动中重用片段。您可以将片段视为活动的模块化部分,它具有自己的生命周期,接收自己的输入事件,并且可... 查看详情

如何从具有相同简单名称的类中查找某个方法?

我有许多驻留在不同包中的ObjectFactory类。它们都是独立的类,这意味着它们不会从任何类扩展。我无法修改这些类。现在,我需要为命令处理程序类提供ObjectFactory。此ObjectFactory必须具有此精确命令处理程序类所需的一组方法。... 查看详情