精简版和完整版的相同PHP组件


Lite and full version of the same PHP component

我想创建同一PHP组件的精简版和完整版。当然,我希望两者共享一个共同的代码库——所以如果我发现一个bug,或者添加一个功能,我只需要在一个地方更新它。

在编译语言中,更好的方法是只有一个项目,有多个目标——每个版本一个。在这种情况下,我会使用预处理器宏来识别代码中的产品版本,从而实现基于版本的逻辑决策。

使用PHP,解决这个问题的最佳方法是什么?当然,完整版本的特定代码不要出现在lite版本的PHP文件中是至关重要的,否则精明的开发人员可能会轻松解锁这些功能。

最好的方法是使用OOP。

例如,创建类的基本版本:

class BasicComponent
{
    ... add basic functionality here
}

创建类的扩展版本:

class FancyComponent extends BasicComponent
{
    ... add fancy stuff here
}

要么只部署基本版本,要么也部署高级版本。


有很多其他方法可以将OOP用于此目的。我可以想象一个工厂,它可以实例化许多特性,其中每个特性都是一个类,并且您只使用组件的基本版本部署其中的一些特性。

根据我在这个类似问题中的发现,我最终以这种方式解决了问题:

1.我安装了Phing,这是一个基于​Apache Ant。

2.我创建了一个build.xml文件,其中包含以下目标:

<target name="preprocess" depends="prepare">
    <foreach param="fname" absparam="abs-fname" target="preprocessfile">
        <fileset dir="${build.dir}">
            <patternset>
                <include name="**/*.php"/>
            </patternset>
        </fileset>
    </foreach>
</target>
<target name="preprocessfile">
    <exec command="gcc -E -x c -P -C -D PREMIUM ${abs-fname} -Wno-invalid-pp-token -o ${abs-fname}" 
        escape="false"
        checkreturn="true"
        passthru="true" />
</target>

在实践中,我在每个PHP文件上启动GCC预处理器,并利用它来做我需要的事情。它工作得很好!

不仅如此:通过Phing,我创建了一些目标来进行PHP验证、JavaScript缩小、创建要部署的存档等等。