Zend_Application
Zend Framework 版本1.10
Zend_Application把应用程序进行抽象包装。其功能职责是加载应用程序配置,并对应用程序进行引导。
Zend/Application包类图大概如下:
如何使用Zend_Application类。
新建一个Zend_Application对象
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
Zend_Application类的构造函数中包含了两个参数。一个是环境定义,另一个是配置项。
环境定义是你自己定义的一个字符串。配置项可以是一个数组,一个Zend_Config实例,或者是一个文件名的字符串(Ini文件,inc文件,php文件或者Xml文件)
构造函数中定义了Zend_Application对象的环境,初始化Zend_Loader_Autoloader的单例,并根据传入的配置,加载配置信息。
新建完Zend_Application对象后,便可对它进行引导了。
$application->bootstrap();
Zend_Application 实际上是把引导方法转发给 Zend_Application_Bootstrap_BootstrapAbstract
Zend_Application 与Zend_Application_Bootstrap_BootstrapAbstract 类是聚合关系。什么是聚合关系呢?(此处省略一千字,详细见http://ir.hit.edu.cn/~car/programming/rup/process/modguide/md_aggrg.htm)
总而言之,也就是说Zend_Application中包含了一个Zend_Application_Bootstrap_BootstrapAbstract(或者说是一个Zend_Application_Bootstrap_BootstrapAbstract的引用 )事实上,Zend_Application_Bootstrap_BootstrapAbstract中也包含了一个Zend_Application的引用 。他们就是通过这个引用进行相互通信的。
当调用Zend_Application的bootstrap()方法时, Zend_Application会先实例化一个Zend_Application_Bootstrap_BootstrapAbstract的子类对象(默认是Zend_Application_Bootstrap_Bootstrap) 。
Zend_Application_Bootstrap_Bootstrap在初始化时,会先取得 Zend_Application中的配置信息。并根据配置信息,初始化相应的引导资源类。
Zend/Application/Resource包中包含了一系列的引导资源。每个引导资源类负责对应用的某个资源的初始化。如Zend_Application_Resource_Db负责初始化应用程序的数据库类,而Zend_Application_Resource_Log则负责初始化应用程序的日志类。引导资源类实现了Zend_Application_Resource_Resource接口,继承自Zend_Application_Resource_ResourceAbstract。
Zend_Application把bootstrap()方法转发给Zend_Application_Bootstrap_Bootstrap ,在Zend_Application_Bootstrap_Bootstrap的bootstrap()中,遍历注册了的引导资源的并调用引导的init()方法。
如果要写一个简化版,大概就是这样:
//应用程序类
class App
{
protected $_bootstrap;
public function bootstrap()
{
$this->_bootstrap = new BootStrap($this);
$this->_bootstrap->bootstrap();
}
}
//引导类
class BootStrap
{
protected $_app;
protected $_resources;
public function __construct($app)
{
$this->_app = $app;
$this->_createResources($app->getOptions());
}
protected function _createResources($option)
{
//根据配置注册相应的引导资源类并array_push至$this->_resources数组中
}
public function bootstrap()
{
foreach($this->_resources as $resource){
$resource->init();
}
}
}
//引导资源抽象类
class ResourceAbstract
{
public function init()
{
//do some thing
}
}
因为Zend_Application_Bootstrap_Bootstrap类可以根据配置项生成不同的引导资源类,所以,我们就不用去写太多的代码了。只要写好一个配置文件就OK,例如我们要数据库类:在config.ini中可以这样写
[yourenvironment]
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = password
resources.db.params.dbname = testUser
这样Zend_Application_Bootstrap_Bootstrap就会在程序引导时,自动初始化数据库类。
关于配置文件如何写?
请其它大侠有时间写。
引导完应用程序类,然后可以运行
$application->run();
当然,可以用连缀语法,引导和运行一起
$application->bootstrap()->run();
Zend_Application类其实也是把run()请求转发给Zend_Application_Resource_ResourceAbstract类,也就是调用Zend_Application_Resource_ResourceAbstract的run()方法。
可别以为Zend_Application就是个懒汉了,每个类都有其自身的使命所在(单一职责原则),过于热心什么都做只会使类变得过于宠大和把管理弄得一团糟。例如你到银行,保安负责把关,柜台人员负责存取款,贷款找业务人员,不同的人负责不同的事,不可能同一个人负责所有的事(如果一个人会所有事情,那他得学多少呀。如果是一个类,那得多么庞大呀。。)。如果你对保安说你要存款,保安会把你的请求转发给柜台人员,由柜台人员执行存款的请求(职责链模式)。