我真的很讨厌写这个问题,因为我是一种“研究人员”,而且,我总是能找到我正在寻找的东西......但这一个让我很烦恼,我找不到答案任何地方......所以,就这样:
正如标题所说,我需要获取一个方法名称,其中尾随类和名称空间路径作为字符串。我的意思是这样的:
"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"
}
我希望这能澄清我的问题:)
魔法常量阅读更多信息
__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"
}
解决方案扩展自上面 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% 大多数人实际需要的!(除了可调用之外还有什么是你想要这个名字的原因?)