xts配置
Object Based Program
PHP最早和C语言一样,走面向过程的道路。作为一个典型的CGI应用,PHP程序从Web服务器请求.php文件开始,到返回页面HTML结束。开发PHP程序的主要任务有两种:验证数据,写入数据库;准备数据,组织页面。不论哪种程序的编写,用面向过程的方式都会非常直观和清晰。
Web项目越发复杂后,PHP从5.0开始提供比较强大的OOP机制,也出现了一批OOP的开发框架。但是很多PHP程序员都深刻感觉到,想跟踪框架的代码运行过程非常绕,非常困难。这是因为OOP开发更注重类和对象的概念,认为编程就是对象间彼此通信,发送消息,所以具体的代码被割裂到许多类的许多方法中。
OOP也有好处,它提供了一个比关联数组更严谨的操作机制。比如我们可以通过编写一个Getter来格式化数据库里取出的某个字段,甚至可以创造一个DataBase里没有字段在运行时使用。虽然关联数组也可以随时创建一个key保存任意的value,但分散于代码各处的写入和读取操作会给软件维护带来很大的麻烦。有一种观点是,面向对象机制其实给开发人员提供了一种逻辑上更贴近自然的代码分类、组织和管理的方式。
xts提倡基于对象开发的模式。保留PHP既有的过程化开发,同时对于一些可以内敛的地方用对象加以包装,提升代码复用率。xts不建议开发人员修改框架中的代码,可以直接简单的使用之。
覆盖式配置
在项目的protected/config
目录里有两个配置文件,一个人是debug.php,另一个是release.php。xts默认使用debug.php中的配置。当运行build脚本时,xts会把webroot/xts.php
文件中定义的X_DEBUG常量改为false,此时xts会使用release.php中的配置覆盖debug.php中的同名配置。
覆盖式配置的好处是相同的配置项无需写两遍,只需要在release.php中写上不同的配置项即可。我曾不止一次遇到需求要改配置即可完成,在debug配置里改了,release配置里忘了改,测试没有任何问题,上线就出bug。xts的等位覆盖机制可以完美避免此类问题。
下面是一个debug配置的例子:
<?php
return array(
'component' => array(
'apple' => array(
'class' => '\\xts\\Apple',
'singleton' => true,
'conf' => array(
'actionDir' => X_PROJECT_ROOT.'/protected/action',
'defaultAction' => '/index',
'actionPrefix' => 'action_',
'preAction' => '',
'preActionFile' => '',
),
),
'db' => array(
'class' => '\\xts\\Query',
'singleton' => true,
'conf' => array(
'host' => 'localhost',
'port' => 3306,
'schema' => 'xts',
'charset' => 'utf8',
'user' => 'xts',
'password' => 'xtstest',
'persistent' => false,
),
),
'view' => array(
'class' => '\\xts\\Hail',
'require' => X_LIB_ROOT.'/hail.php',
'singleton' => true,
'conf' => array(
'tpl_dir' => X_PROJECT_ROOT.'/protected/view',
'tpl_ext' => 'html',
'compile_dir' => X_RUNTIME_ROOT.'/compiled_template',
'enable_clip' => false,
'cacheId' => 'cc', // string to cache component id or false to disable cache
'cacheDuration' => 60, // page cache duration, second
)
),
),
);
在release配置中,由于只有数据库的库名、登录密码、长连接的配置有所不同,所以可以只写这些:
<?php
return array(
'component' => array(
'db' => array(
'conf' => array(
'schema' => 'xts_example',
'password' => 'dk23Jssk887^0',
'persistent' => true,
),
),
),
);
xts在X_DEBUG置为false时,用release配置覆盖debug配置,合并成实际使用的配置数组。