深入浅出理解zend framework(二)

Zend_loader

      首先说这个模块的原因,是因为自php5以后,支持类的autoloader了。Zend框架,也依靠autoloader来实现自动加载。所以有必要先说说这个类的实现方式,以及如何在项目中运用。

      虽然名义上是自动包含,但总得有东西去实现自动包含这个功能,zf是无法自动包含自己的,因此首先需要在index.asp中包含”Zend/Loader/Autoloader.php”文件,由autoloader类来实现其他zf类及自定义类的加载。

      Autoloader类通过目录名称来区分命名空间。比如 Zend_Config_Ini,就去会Zend目录下的Config目录去寻找Ini.php文件。$_namespaces定义了默认的名称空间:Zend_和ZendX_.

      项目自己定义的类库,则在application.ini中通过 autoloadernamespaces类声明,比如一个类库叫做Service,则通过如下语句声明:

                  Autoloadernamespaces.Service=”Service_”

 

      包含autoloader.php文件后,紧跟着获取一个autoloader实例。在构造过程中,会通过spl_autoload_register函数,注册新的autoload解析函数。这样zend框架,就接管了自动加载类的任务。遇到未加载的类时,会依次根据Zend,ZendX,自定义命名空间的顺序加载。我们在程序中,就可以直接使用这些类,而不用担心是否正确包含了相关的文件。除了预先定义的命名空间,在开发中还可以通过unshiftAutoloader方法,直接将实体类加入到autoloader链中。

 

     类图

 

    类说明:

class Zend_Loader_Autoloader

{

     protected staic $_instance;//Zend_Loader_Autoloader的单例

     protected $_autoloaders=array();//需要加载的类数组

     protected $_defaultAutoloader=array(‘Zend_Loader’,loadClass)//设置用于完成自动加载功能的类

     protected $_fallbackAutoloader=false;//?

     protected $_internalAutoloader;//

     protected $_namespaces=array(‘Zend_’)=>true,’ZendX_’=>true,);//设置支持自动装载的命名空间,默认支持加载zend自己的类库,在程序中,会通过配置文件,和调用。。。方法加入对自己类库的支持

     protected $_namespaceAutoloaders=array();//已加载的命名空间数组

     protected $_suppressNotFoundWarnings=false;//如果加载失败(类定位文件无法找到)时,是否忽略警告,默认为false,即警告。

     protected $_zfPath; //

 

     public static function getInstance()//返回静态单例,如果单例不存在,则创建,如存在,直接返回。

     public staic function resetInstance()//充值单例,函数只销毁现存单例,并不重新生成单例。

     public static function autoload($class)//自动加载$class类,首先获取单例,然后调用getClassAutoloaders方法,获取可能得加载方式。如果其实现了Zend_Loader_Autoloader_Interface接口,则直接调用其autoload方法。否则调用Zend_Loader类加载该$class

     public function setDefaultAutoloader($callback)//设定默认的autoloader处理方法,

     public function getClassAutoloaders($class)//获取各种可能得加载方式

     public function unshiftAutoloader()//注册新的命名空间

     public function _autoload()//加载zend类库和application.ini中声明的类库。

 

序列图

 

 

 

 

 

其他图

 

相关PHP内置函数:

    设置包含路径:

        string set_include_path ( string $new_include_path )

        应用文件:index.php

        应用目的:将所用到的类库目录包含进来,方便autoload函数加载相关类。

   

    检查类是否已定义:

        bool class_exists ( string class_name )

        应用文件:Zend_Loader.php

        应用目的:检测类是否已定义,如已定义,则不再重新加载

   

    调用相关函数:

        call_user_func和call_user_func_array

        应用文件:Zend_Load_AutoLoader.php

        应用目的:调用Zend_Loader类的loadClass加载相关类

 

     注册新的autoload处理函数:

        spl_autoload_register

        应用文件:Zend_Load_AutoLoader.php

       应用目的:将autoloader注册为自己的方法,接管自动加载任务。

 

     在项目中的应用:

          上面其实也提到了,autoload如何在项目中应用,就是通过在application.ini中注册自己类库的命名空间,来实现在程序中自由的使用。

 

 

posted @ 2012-03-03 21:42  abner.liu  阅读(1846)  评论(0编辑  收藏  举报