关于PHP中命名空间和spl_autoload_register函数的关系说明

关于PHP中命名空间和spl_autoload_register函数的关系说明


  • 794

在我们使用命名空间的时候,只完成了一种逻辑关系的独立。意思也就是说,对于PHP引擎来说,当他看到 namespace myclass;的时候,可以知道,此名称以下定义的类库拥有了一个独立的空间,名字叫做 myclass 。而同样的类库名称不能在同一个明明空间中,意思类似于,同一个文件夹下,不能创建相同名称的两个文件。 但是我们如果定义了不同的命名空间和类库,然后想要正常的在一个命名空间的类库中调用另一个命名空间的类库,即使使用了use 这个关键字,我们会发现,系统依然调用不到相应的类库。这就好像,我们在C盘放了一个文件,D盘放了一个文件,然后他们是独立的,可是我想在C盘的文件中调用D盘的文件,只有一个名字是不可能调用的到的。我们只是new 了一个类库,但是系统是找不到这个类库在哪里的,所以我们需要手动去引入D盘的文件到C盘的文件中,才能互相使用。但是当我们系统中有几百个类库的时候,手动一条条引用,显然是不现实的,那么我们就需要一个按着需求自动引入类库的机制。而要完成这样一个机制,我们就要用到spl_autoload_register函数。

当用户调用不存在的类库名称PRINTIT的时候,spl_autoload_register函数指定loadprint方法来处理这个事情,而loadprint方法会得到没有找到的类库的名称,也就是‘PRINTIT’,然后通过require_once把“PRINTIT.class.php”引入进来,当然前提是,PRINTIT类库就在“PRINTIT.class.php”文件中。 这样,貌似问题就解决了,但是还有个情况,当用户的系统情况复杂,类库不在一个目录当中,这该怎么引用呢? 我们可以在给类库定义命名空间的时候,空间名字采用当前类库文件所在的物理地址定义,比如:namespace app\admin\model;然后当用户需要调用这个文件中的名字叫做NodeModel的类库的时候,使用use app\admin\model\NodeModel; 然后当这个时候,因为我们用use关键字引用了app\admin\model命名空间中的NodeModel类库,所以,这个时候,我们再来看程序:


当运行之后,因为找不到“NodeModel”类库,所以调用loadprint方法,输出缺失的方法名: app\admin\model\NodeModel 所以,因为我们引用了命名空间“app\admin\model\NodeModel”,但是实际上没有引用此类库所在的文件,然后系统返回的缺失类库名称和引用的命名空间相同,这样我们就可以通过这个命名空间来引用实际文件(因为之前所有类库的命名空间我们要求按着物理实际路径起名字)。 当然还有个细节,就是我们需要用str_replace函数把“app\admin\model\NodeModel”中的“\”替换为“\\”,然后用require_once引用便可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值