【发布时间】:2012-02-26 07:33:42
【问题描述】:
我有一个可以为不同客户定制的代码库。在大多数情况下,这是通过加载一个类来处理的,该类具有特定于每个客户的常量,但具有相同的类名。管理类名冲突,显然,一次只加载一个。
class Customer () {
const CUST_NAME = 'Alpha Corp.';
}
class Customer () {
const CUST_NAME = 'Beta, Inc.';
}
对于每个客户,我也希望代码能够国际化。因此,程序可以从特定语言的源中提取其显示的文本,但对于特定于客户的信息来说仍然是动态的。假设客户特定信息对 i18n 无动于衷。这将文件数量从每个客户每种语言一个,减少到每种语言一个。期望的结果是实现类似于
// in separate language files:
$greeting = 'Hello. Welcome to ';
$greeting = 'Hola. Bienvenido a ';
// in front-end
$greeting = get $greeting in desired language;
echo $greeting, Customer::CUST_NAME, "\n";
我可以设计出满足这些要求的最佳解决方案是 i18n 类(或类族),它可以处理多个客户和/或多种语言。但是,与字符串文字或常量相反,调用方法的执行成本很高。这些方法将结合来自常量或外部源的翻译,并将它们与来自 Customer 类的值结合起来。 (我现在被 PHP 5.2 卡住了,所以类属性/常量的 heredoc 的细节不可用。)
class i18n_en () {
const GREETING = 'Hello. Welcome to ';
static public function getGreeting () {
return self::GREETING . Customer::CUST_NAME;
}
}
或者,我可以为“模板方法”编写一个脚本,在其中我维护一个类的模板文件,其中包含文本占位符。客户特定文件是在从这些模板创建客户时生成的。根据需要生成或重新生成文件很容易,但我又需要为每种语言的每个客户创建一个单独的文件。因此,它不能很好地满足我的需求。
当然,我不是第一个遇到这个问题的人。任何人都可以提供替代方案或最佳实践吗?由于代码的执行次数比我创建新客户的次数多很多倍,因此我更喜欢运行时效率而不是易于维护。当然,一个很好的解决方案可以同时提供。
【问题讨论】:
-
您确定一个方法调用会在该
getGreeting()方法的一千次调用中产生任何可分析的开销吗?静态字符串连接的繁琐值得衡量吗?