2009-12-11 3 views
0

Я работаю над некоторыми новыми компонентами в моей структуре для реализации gettext. Он должен поддерживать мертвые php4 и php5 +. Я использую Zend_Translate, и я буду использовать класс, основанный на gettext для php4.Это хорошая идея и надежная возможность развернуть номер версии php?

Мне интересно, можно ли полагаться на функцию 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> 

Есть ли общее сделать это в любом из основных фреймворок, вы бы сделать что-то подобное, если вы были вынуждены поддерживать мертвую PHP4?

+1

да, это, наверное, самое надежное место для поиска версии PHP – jlb

+1

и вас может заинтересовать http://docs.php.net/version_compare – VolkerK

ответ

2

Если бы я собирался реализовать это на PHP-версиях, я бы тоже полагался на номер версии. Итак, то, что вы предлагаете, кажется совершенно нормальным и приемлемым.

1

Я думаю, что получение номера версии является хорошей идеей, но оно должно быть неявным, поэтому оно не вызывается из синего.

$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() может даже извлекать объект из более долгого кэша, если он вам понадобится, просто поместив логику в одно место, получающее ваш реальный объект.

+0

Это будет работать так же, если я не буду полагаться на ключевые слова «private» и «public», поскольку они не совместимы с PHP4, правильно? –

+0

Это было бы, если бы вы использовали метод, а не свойство (поскольку afaik всегда является общедоступной объектной моделью php4.) Хороший улов! – chelmertz

2

Это не ужасная идея расшириться на ряд 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 :)

+0

Если предварительным условием является PHP4, я не думаю, что ваш метод потерпит неудачу изящно, если он попытается использовать Zend_Translate и не выполнит некоторые из его методов, так как класс, вероятно, не был протестирован, может быть определен в PHP4. – chelmertz

+0

Класс не может быть определен, если он использует ключевые слова php5, такие как 'private' или' public'. Версия Zend_Translate у меня была удобной. – gnud