我正在我的框架中为gettext实现开发一些新组件。它需要支持失效的php4和php5+。我正在使用Zend_Translate,我将为php4实现一个基于gettext的类。
我想知道依靠phpversion函数来扩展实现哪个类是否合适。就像..。
$version = phpversion();
define('VERSION', grabVersion($version) ); // grab major version
if ( VERSION >= 5 ) {
$local = new Zend_Translate();
} else {
$local = new Gettext();
}这两个类都有一个_函数来进行转换,因此其余的应该是相同的。
<label for="first_name"><?php echo $local->_("First Name");?></label>在任何主要的php框架中,这样做都很常见吗?如果你被迫支持已死的PHP4,你会做类似的事情吗?
发布于 2009-12-12 02:16:06
如果我要跨PHP版本实现这一点,我也会依赖于版本号。所以你提出的建议看起来是完全合理和可以接受的。
发布于 2009-12-12 02:24:26
在php版本号上进行分支并不是一个糟糕的想法,但我更喜欢这样的方式:
if(class_exists("Zend_Translate")) {
$local = new Zend_Translate();
} else if(class_exists("Gettext")) {
$local = new Gettext();
} else {
throw new Exception("No supported translation helper found");
}如果你愿意,你可以让它更具动态性:
$translators = array(
"Zend_Translate",
"Gettext",
"FooTranslate",
);
$local = null;
foreach($translators as $t) {
if(class_exists($t)) {
$local = new $t();
break;
}
}
if($local === null) {
throw new Exception("No supported translation helper found");
}根据版本进行分支的一个更好的地方是错误处理-上面我使用了PHP4中没有的异常:)
发布于 2009-12-12 02:20:08
我认为获取版本号是一个好主意,但它应该是隐式的,这样它就不会突然被调用。
$local = TranslateFactory::create();
$local->_("translate me");
class TranslateFactory {
private static $_translator;
private static function _getTranslator() {
if(empty(self::$_translator)) {
// get php version
// if-case here
self::$_translator = // result your if-case
}
return self::$_translator;
}
public static function create() {
return _getTranslator();
}
}它至少提供了每个请求的缓存。如果您需要的话,_getTranslator()甚至可以从一个更持久的缓存中获取对象,只需将逻辑放在获取实际对象的一个点上。
https://stackoverflow.com/questions/1889392
复制相似问题