微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP 回调:类的方法是否有 ::class 的等价物?

如何解决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 举报,一经查实,本站将立刻删除。