zend framework源码笔记

ZF是利用apache的rewrite技术实现单一入口,打开public/index.php文件开始进行源代码的解读。

 

一开始定义的是一些系统常量,比如程序根目录等,第一个文件

 

require_once 'Zend/Application.php';

 

这是程序启动所要加载的第一个文件,它包含了ZF的整个核心构建,首先是创建类并初始化

$application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' );
在构造类时,首先调用构造函数,在构造函数里面有有一个$this->_autoloader = Zend_Loader_Autoloader::getInstance();这是实现ZF的类文件的自动包含,即:当某个类不存在是,ZF会自动调用某个机制进行处理,当使用到时再进行跟进。由于构造函数的$options选项是字符串,故程序会加载 configs/application. ini 文件, 由此我们也会知道ZF是在初始化是载入配置文件的,下面看一下ZF是如何载入配置文件的

  protected function _loadConfig($file) { $environment = $this->getEnvironment(); $suffix = strtolower(pathinfo($file, PATHINFO_EXTENSION)); switch ($suffix) { case 'ini': $config = new Zend_Config_Ini($file, $environment); break; case 'xml': $config = new Zend_Config_Xml($file, $environment); break; case 'php': case 'inc': $config = include $file; if (!is_array($config)) { throw new Zend_Application_Exception('Invalid configuration file provided; PHP file does not return array value'); } return $config; break; default: throw new Zend_Application_Exception('Invalid configuration file provided; unknown config type'); } return $config->toArray(); }  

ZF是通过私有函数    protected function _loadConfig($file) 载入配置文件的,有代码可看出它不止支持ini型文件,跟踪到Zend_Config_Ini可以仔细观察,但是在进入Zend_Config_Ini以前,因为没有包含Zend/Config/Ini.php文件,ZF会子动调用Zend_Loader_Autoloader::getInstance()接口进行加载,进入Zend/Loader/Autoloader.php文件,Zend_Loader_AutoLoader类的构造函数利用SPL(即:spl_autoload_register(array(__CLASS__, 'autoload'));)技术,让autoload函数处理尚未定义的类,即加载相应的文件,ZF除了处理简单的包含用有该类的文件外,还处理了命名空间等,不做介绍。可以发现autoload()是调用Zend/Loader.php文件的loadClass()函数加载相应的文件并进行相应的处理,到此,ZF已经自动加载完Zend/Config/Ini.php文件,即可调用Zend_Config_Ini类,ini解析完成后返回配置文件的一个数组,然后教给 public function setOptions(array $options) 这个函数进行处理,在设置工程中,由于会设置相应的参数,Bootstrap启动文件同样会被设置,并被创建了一个实例,而且将$application这个实例作为参数传个了他,我想在后面肯定会拿次做文章

到此整个项目的环境设置完毕,下面就是运行了
 
接下来运行bootstrap引导程序
$application->bootstrap() //这应该是运行引导文件 ->run(); //这是启动项目
   运行启动文件,其构造函数来自Zend_Application_Bootstrap_BootstrapAbstract抽象类
public function __construct($application) { $this->setApplication($application); $options = $application->getOptions(); //get the option which set in Application Class $this->setOptions($options); }
在设置options的过程中,我们可以通过在Bootstrap.php文件写一些函数比如setincludepaths()函数对配置文件的内容作出修改
再次,ZF同样是注册了插件系统,设置了$this->_pluginResources[$resource] = $options;将controller目录进行记录,应该是相当于使用插件时的下面代码(这些代码在Zend手册的Plugins里面有的)
$front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('/path/to/controllers')

 在$application->bootstrap()的实现,是在文件BootstrapAbstract.php中 protected function _bootstrap($resource = null)这个函数,首先ZF查找传递过来的资源,如果为空,则自动查找Bootstrap.php文件中的所有以_init开头的函数,并执行

你可能感兴趣的:(exception,function,File,application,Zend,autoload)