首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在php版本号上扩展一下是不是一个好主意?

在php版本号上扩展一下是不是一个好主意?
EN

Stack Overflow用户
提问于 2009-12-12 01:00:03
回答 3查看 85关注 0票数 0

我正在我的框架中为gettext实现开发一些新组件。它需要支持失效的php4和php5+。我正在使用Zend_Translate,我将为php4实现一个基于gettext的类。

我想知道依靠phpversion函数来扩展实现哪个类是否合适。就像..。

代码语言:javascript
复制
$version = phpversion();
define('VERSION', grabVersion($version) ); // grab major version

if ( VERSION >= 5 ) {
   $local = new Zend_Translate();
} else {
   $local = new Gettext();
}

这两个类都有一个_函数来进行转换,因此其余的应该是相同的。

代码语言:javascript
复制
<label for="first_name"><?php echo $local->_("First Name");?></label>

在任何主要的php框架中,这样做都很常见吗?如果你被迫支持已死的PHP4,你会做类似的事情吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-12 02:16:06

如果我要跨PHP版本实现这一点,我也会依赖于版本号。所以你提出的建议看起来是完全合理和可以接受的。

票数 2
EN

Stack Overflow用户

发布于 2009-12-12 02:24:26

在php版本号上进行分支并不是一个糟糕的想法,但我更喜欢这样的方式:

代码语言:javascript
复制
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");
}

如果你愿意,你可以让它更具动态性:

代码语言:javascript
复制
$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中没有的异常:)

票数 2
EN

Stack Overflow用户

发布于 2009-12-12 02:20:08

我认为获取版本号是一个好主意,但它应该是隐式的,这样它就不会突然被调用。

代码语言:javascript
复制
$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()甚至可以从一个更持久的缓存中获取对象,只需将逻辑放在获取实际对象的一个点上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1889392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档