如何解决PHP 回调:类的方法是否有 ::class 的等价物?
在 PHP 中,可以通过类名解析获得完整的类名,如下所示:
示例:
namespace Name\Space;
class ClassName {}
echo ClassName::class;
输出:Name\Space\ClassName
这比在代码中直接使用字符串 Name\Space\ClassName
更好,因为代码自省尤其是在 IDE 中可以直接发现错误。
我想知道类的方法是否有类似的东西 - 这对回调函数特别有用。
这是您基本上可以传递回调的方法:
$a = function($callback,$arg) { return $callback($arg); }
$a('getInfo',5);
与其在这里传递一个字符串(可能会改变),我更愿意做这样的事情:
$a(MyClass::class::getInfo,5);
通过在 IDE 中单击“转到声明”,我可以直接转到 getInfo
并且如果方法不再存在,我会看到错误。有没有办法在这里实现我想要做的事情?
解决方法
实际上,您使用的是可调用类型。 PHP 只允许将方法/函数名称设置为字符串。但是如果你使用类和对象,你将有一种不同的方式来设置回调。例如:
docker push
,
三种可能。
(1)
echo `__CLASS__`;
...以字符串形式返回 namespace\classname
。
(2)
如果您试图从另一个类中获取 namespace\classname,即,不是您当前正在执行代码的那个类,那么我建议在每个类中设置一个公共属性,例如:
public static $classname = __CLASS__;
然后你可以从任何地方访问:
ClassName::$classname
把它放在你的每个班级中。始终使用相同的属性名称。
(3)
您是否考虑过 PHP 函数 debug_backtrace()
,它返回一个调用堆栈,其中最近一次调用位于索引 = 0;
所以,如果:
$caller = debug_backtrace();
然后,$caller[0]['class']
在您调用 debug_backtrace() 处包含完全限定的类名,包括任何命名空间。
我猜#2 是适合您的解决方案。
刚刚想到了不依赖于您向每个类添加任何代码的第四种可能性。虽然可能会增加一些开销,但我上面的第三个解决方案也是如此。
(4)
$declared_classes = get_declared_classes();
这列出了当前在 PHP 范围内声明为完全限定的 namespace\classname 的所有类。您可以在返回的数组中搜索部分字符串匹配并返回整个 namespace\classname 字符串。
要记住的一件事。如果不同的命名空间具有同名的类,则可能会有重复项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。