29th
十一月

PHP:浅析Savant模板引擎机制
马克龙 发布于: 2009年11月29日 开发与应用 标签:, , , 评论 (0)

要说到优秀的PHP模板引擎,PHPer响应最多的一定是Smarty,它使用自己的模板语言,所以需要将模板“编译”成PHP。

Savant也是面向对象的PHP模板引擎,但它使用PHP本身来作为它的模板语言,不需要“编译”,代码量更少、执行速度更快。Savant只包含了模板引擎的最基本功能(如数据格式化功能),但它有一个面向对象的模板插件系统和输出过滤器,可以让你快速为它新增新的行为。我想,这是Cal Henderson在《构建可扩展的Web站点》一书中推荐Savant的理由。

最新版的是Savant3,其使用及其简单、清晰,使用Demo见:http://phpsavant.com/docs/,API见:http://phpsavant.com/api/Savant3/

Savant3的文件目录结构如下

Savant3.php //包含Savant3类
Savant3
    resources //此文件夹存放插件和过滤器
        Savant3_Filter_trimwhitespace.php //trimwhitespace过滤器,其类Savant3_Filter_trimwhitespace继承了Savant3_Filter
        Savant3_Plugin_ahref.php //ahref插件,其类Savant3_Plugin_ahref继承了Savant3_Plugin,下同
        Savant3_Plugin_date.php //date插件
        Savant3_Plugin_htmlAttribs.php //htmlAttribs插件
        Savant3_Plugin_image.php //image插件
    Error.php //包含错误类Savant3_Error
    Exception.php //包含异常类Savant3_Exception
    Filter.php //包含抽象过滤器类Savant3_Filter,规定了编写“官方”过滤器须要遵循的接口。但函数或不是Savant3_Filter的子类方法也可以作为过滤器。
    Plugin.php //包含抽象插件类Savant3_Plugin,规定了编写插件须要遵循的接口

(全文…)

26th
十一月

凭什么让你脱颖而出?
马克龙 发布于: 2009年11月26日 职场与职业思考 标签:, , , 评论 (1)

凭什么让你脱颖而出?

自前段时间看了唐骏08年夏在大连理工的演讲后,这是我一直在思考的问题。

25th
十一月

设计模式:Chain of Responsibility
马克龙 发布于: 2009年11月25日 开发与应用 标签:, 评论 (0)

责任链模式(CoR)的目的是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,以应变系统需求的变更和不明确性。将这些处理对象(即接收者)连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。CoR的核心思想是:通过将多个处理者之间建立联系,来达到请求与具体的某个处理者的解耦。

关于CoR,有纯与不纯的说法。纯的CoR规定,每个处理者只能对请求作出一种动作:要么自己处理,要么转发给后继处理者。而不纯的CoR,譬如一个请求被捕获后,每个处理者都尝试去处理它,不管结果如何都将请求再次转发。

假设某企业的采购人员进行采购前需经过上级部门的批准(分级进行),根据采购金额(单位:RMB)的不同由不同层次的负责人来审批:采购经理审批的采购单金额范围为(0, 50000),副董事长为[50000, 100000),董事长为[100000, 500000),而超过500000的采购单需要举办董事会来讨论决定。对于不同金额的采购分别要由不同级别的上级才能审批,这样的采购审批过程就形成了一条责任链,对于不同的采购审批请求就需要一级一级地向上传递,直到被处理。

以下为CoR的PHP代码实现,Java、C++等亦如出一辙。

(全文…)