Home » Code » PHP中的类的别名

PHP中的类的别名

PHP中函数的别名可能见过不少,比如die()&exit()、join()&implode()等等,类的别名可能听的就不多了。最近就遇到关于类的别名的事,折腾了一两天,记录如下。

ThinkPHP中有这么一个配置参数:DEFAULT_C_LAYER,也就是控制器层,可以改变控制器的名称,比如默认的是控制器命名一般是IndexController,定义这个参数假如为Action,那么控制器就变成了IndexAction。当然你不叫Action叫AAA,那控制器名就是IndexAAA。相应的控制器文件夹是也由Controller也跟着变为Action(或AAA)。

其实要说的问题跟这个控制器层参数无关,只是在这个问题里它影响了我的一点判断,再说这个也得知道一下,故也说一说。

正式问题开始,在控制器IndexAction中,代码写了use Action,IndexAction extends Action,Zend Studio编辑器报异常”cannot extends from interface ‘Action'”。纳闷Action是个接口难道?一番寻找,全局搜索,没有找到任何Action.class.php的影子,这个类根本就不存在。不存在怎么能被继承而代码运行正常呢?各种百度谷歌,有说3.2后没有Action了,都是Controller,就没其他了,这压根没有用的答案。群里更惨,根本不人鸟,是看不懂还是根本不想理人,一阵心酸,平常还各种帮人解决问题,轮到自己却没一句安慰。

到TP官网发帖子询问,昨晚发的到今天早上,18个查看0回复,查看好多还是我贡献的,哎。于是开始查看源码看能不能看出点猫腻,明明实例化控制器的时候就是new IndexAction,Action根本就不存在,结果硬硬没有报错,一切正常。它的父类到底是谁?执行new parent操作,报错Cannot instantiate abstract class Think\Controller,我擦,这写的Think\Action,怎么变成Think\Controller了?到另一个框架的群,问题出来就被说”到TP群问,别来这里吵架”,我丢,如今框架之间还斗到这地步了?还好还是有热心人回答的,但大多都不是回答我的问题“Action怎么变Controller”的问题,而是回答抽象类不能实例化、new parent奇葩写法等等,我晕。。。

当然,大神总是有的,也总能在一群无关的回答中写出“有一种叫class_alias的东西”这种闪亮的文字,一开始我还没悟过来,追问如何实现,大神却已不再说话。这时候TP官网上我的帖子也得到官方回应:

ThinkPHP_Action_Controller
果断再全局搜索“class_alias”,终于得到时答案,在控制器基类Controller.class.php末行,赫然写着:

// 设置控制器别名 便于升级
class_alias('Think\Controller','Think\Action');

再查查手册,原来是这么回事。原来,类也可以设置别名,而且是通过这么个函数。既然都废弃了Action,这代码怎么还这么写,看来我得建议改过来,避免后来人也踩这么个坑。

凡事追究一下,总能学到点什么。感谢所有在这个问题中给予回答的各位网友们!

PS:查看父类的名称,可以通过get_parent_class()这个函数的。

我在TP官网的帖子在此:
http://www.thinkphp.cn/topic/31685.html

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.