2014-09-20 40 views
6

在PHP中,您可以使用class_alias function来定义类别别名。有没有办法获得当前在运行时定义的所有类别名单?所有PHP别名列表

+2

不,但如果你是唯一一个创建别名,你可以做一些包装单体类来处理这个亚。 – Smuuf 2014-09-20 08:16:30

回答

4

正如hek2mgl所示,这在PHP中不可行。取决于为什么你想这可能有可行的解决方法,但。

我假设你现在正在尝试检测在第三方代码中创建的别名。然后install the Runkit module你可以设置runkit.internal_override1,使本机的功能改进,并做这样的事情在你的项目的根文件:

runkit_function_rename('class_alias', 'class_alias_internal'); 
function class_alias($original, $alias, $autoload = TRUE) 
{ 
    Logsomewhere("Creating alias from $original to $alias!"); 
    class_alias_internal($original, $alias, $autoload); 
} 

当然这也意味着,你可以建立正是你的列表求。我没有看到该功能的任何运行时生产用途(纠正我,如果我错了),所以你只需要在开发服务器上这样做,只要需要。由于Runkit是一个相当危险的模块,我甚至会在完成后立即在devserver上禁用它。

对于其他情况类似的解决方法可能是可行的,但我需要知道你为什么寻求这些信息。就PHP而言,一个别名是假设不可检测,所以它的工作正常(对于更改)。

+0

可疑的是,它是检测第三方代码中的别名。感谢您的runkit建议! – 2014-09-20 19:51:08

4

看看PHP的源代码。别名注册后,PHP不知道什么是原始的,什么是别名。像文件系统中的硬链接一样。然而https://github.com/php/php-src/blob/master/Zend/zend_API.c#L2728

,答:你可以查看代码,在它的最新版本,在这里(注意,链接可能在你正在阅读这个时刻已经过时搜索功能zend_register_class_alias_ex然后。)函数显示具有多个指定引用的类表的条目可以制作(在PHP的核心中,使用C),但看起来目前不可用。

+1

+1我非常感谢你为我挖掘源代码 - 这是我希望自己擅长的事情之一。 – 2014-09-20 19:52:05

+1

我很高兴我可以帮忙.. :) – hek2mgl 2014-09-20 23:24:33