PHP 如何获取带有类和命名空间路径的方法名称作为字符串?

问题描述 投票:0回答:2

我真的很讨厌写这个问题,因为我是一种“研究人员”,而且,我总是能找到我正在寻找的东西......但这一个让我很烦恼,我找不到答案任何地方......所以,就这样:

正如标题所说,我需要获取一个方法名称,其中尾随类和名称空间路径作为字符串。我的意思是这样的:

"System\Language\Text::loadLanguageCache"
。 正如我们所知,您可以通过键入来获取类名(具有完整的命名空间路径),即:
Text::class
并返回
"System\Language\Text"
,但是有没有办法为方法获取此名称?类似于:
Text::loadLanguageCache::function
获取字符串:
"System\Language\Text::loadLanguageCache"

编辑:

我想我应该进一步解释这一点......我知道魔法常量

__METHOD__
,但问题是它在被调用的方法内部工作,而我需要这个“方法外部”。 以此为例:

//in System\Helpers function someFunction() { return __METHOD__; }

如果我调用我将得到的函数(假设该方法位于

System\Helpers

 类中),那就没问题了 - 
"System\Helpers::someFunction"
。但我想要的是这个:

//in System\Helpers function someFunction() { //some code... whatever } // somewhere not in System\Helpers function otherFunction() { $thatFunctionName = Helpers::someFunction::method //That imaginary thing I want $thatClassName = Helpers::class; //this returns "System\Helpers" }

我希望这能澄清我的问题:)

php string class methods namespaces
2个回答
3
投票
您必须使用魔法常量,您可以在 php.net 中的

魔法常量阅读更多信息

__METHOD__
在课堂之外,您必须使用 

Reflection,如 ReflectionClass 文档中所述:

<?php $class = new ReflectionClass('ReflectionClass'); $method = $class->getMethod('getMethod'); var_dump($method); ?>;
退货:

object(ReflectionMethod)#2 (2) { ["name"]=> string(9) "getMethod" ["class"]=> string(15) "ReflectionClass" }
    

0
投票
我也需要这个,因为将命名空间放入字符串中会给出双反斜杠,这在重命名命名空间时很糟糕。

解决方案扩展自上面 IMSoP 的评论。

使用这个:

$callable = [\namespace\classname::class, 'method'];
接到电话时:

$callable($arg1, $arg2) ;
就像打电话一样

\namespace\classname::method($arg1, $arg2);
例如:

<?php namespace xxx\yyy; class myClass { static function methodA(string $name) { echo 'method A called, '.$name.'. '; } function methodB(string $name) { echo 'method B called, '.$name.'. '; } } $callableA = [myClass::class, 'methodA']; $callableB = [new myClass, 'methodB']; var_dump($callableA); var_dump($callableB); $callableA("madam"); $callableB('sir');
结果:

array(2) { [0]=> string(15) "xxx\yyy\myClass" [1]=> string(7) "methodA" } array(2) { [0]=> object(xxx\yyy\myClass)#1 (0) { } [1]=> string(7) "methodB" } method A called, madam. method B called, sir.
IMSoP 在评论中为大多数搜索该主题的人提供了正确的答案。 11年来,他们懒得把它作为答案,所以我会的,因为我自己在寻找这个主题时几乎忽略了它。

不是 100% OP 要求的,而是 100% 大多数人实际需要的!(除了可调用之外还有什么是你想要这个名字的原因?)

© www.soinside.com 2019 - 2024. All rights reserved.