Zend_Loader_Autoloader的运行原理

本文详细介绍了自动加载的原理及其在Zend应用中的实现,包括名称空间的注册方式、加载器的类型以及类加载的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动加载的原理是Zend_Application实例了Zend_Loader_Autoloader,使其调用了spl_autoload_register(array(__CLASS__, 'autoload')); 这样如果找不到的类就会调用此对象的autoload方法进行处理。

一个名称空间可以有多个加载器,迭代找出符合的自定义加载器后,其余的就不会使用了,一般我们只会针对一个名称空间注册一个自定义加载器或者直接使用默认的加载器。

注册名称空间方式分为两种:

  • 只注册了空间的前辍,没有指定任何加载器,注册方法为registerNamespace('空间名称')。
  • 注册了空间前辍,并指定了加载器。注册方法为pushAutoloader(加载器,'空间名称')或unshiftAutoloader(加载器,'空间名称')两个方法的区别是push将加载器放到指定空间名称的加载器队列之后,unshift是之前。

当一个类没有找到并要求载入时,其类名交给Zend_Loader_Autoloader::autoload()处理,会经历以下几个过程:

  • 用已经注册名称空间前辍和此类名进行对比,找出名称空间指定的加载器。
    1. 用名称空间注册方式第二种名称前辍和此类名前辍进行对比,找出名称空间指定的加载器。
    2. 用名称空间注册方式第一种名称前辍和此类名前辍进行对比,如果存在则用Zend的加载器。
    3. 如果没有任何名称空间前辍和此类相等,而确设置了FallbackAutoloader标志则也使用Zend的加载器,否则不返回任何加载器,此类也就不能被载入了。
  • 如果加载器是实现了Zend_Loader_Autoloader_Interface接口的类则将类名传给其autoload方法进行加载,如果加载器是一个函数则将类名当做此函数的参数进行加载。如果加载器是一个数组则用call_user_func回调函数进行加载。

自定义的加载器有以下几种形式:

  1. 一个实现了Zend_Loader_Autoloader_Interface接口的对象
    1$autoloader = Zend_Loader_Autoloader::getInstance();
    2$myAutoloaderClass = new my_Autoloader();
    3$autoloader->pushAutoloader($myAutoloaderClass, myNamespace);
  2. 一个函数
    1$autoloader = Zend_Loader_Autoloader::getInstance();
    2function myAutoloaderFun(){ //TODO };
    3$autoloader->pushAutoloader('myAutoloaderFun', myNamespace);
  3. 以回掉方式(callback)调用一个对象或类的方法.(回掉函数call_user_func)
    1$autoloader = Zend_Loader_Autoloader::getInstance();
    2$autoloader->pushAutoloader(array('类名', '方法'), myNamespace);

Zend加载器对象方法是Zend_Loader_Autoloader::_autoload。此方法会用call_user_func调用最终的加载方法如默认为array('Zend_Loader', 'loadClass')对当前对象进行加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值