2009-12-11 2 views
0

Je travaille sur de nouveaux composants dans mon framework pour une implémentation gettext. Il doit supporter les morts php4 et php5 +. J'utilise Zend_Translate et j'implémenterai une classe basée sur gettext pour php4.Est-ce une bonne idée et fiable de se ramifier sur le numéro de version php?

Je me demande s'il est correct de se fier à la fonction phpversion pour se ramifier sur la classe à implémenter. Quelque chose comme ...

$version = phpversion(); 
define('VERSION', grabVersion($version)); // grab major version 

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

Les deux classes ont une fonction _ pour faire les traductions, de sorte que le reste devrait être le même.

<label for="first_name"><?php echo $local->_("First Name");?></label> 

Est-il courant de le faire dans l'un des principaux cadres de php, feriez-vous quelque chose de similaire si vous avez été obligé de soutenir le PHP4 mort?

+1

ouais, c'est probablement l'endroit le plus fiable pour chercher la version PHP – jlb

+1

et vous pourriez être intéressé par http://docs.php.net/version_compare – VolkerK

Répondre

2

Si j'allais implémenter ceci à travers les versions de PHP, je compterais aussi sur le numéro de version. Donc, ce que vous proposez semble parfaitement sain et acceptable.

1

Je pense que l'obtention du numéro de version est une bonne idée, mais elle devrait être implicite, donc elle n'est pas appelée à l'improviste.

$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(); 
    } 
} 

Cela fournit un cache par requête au moins. Le _getTranslator() pourrait même récupérer l'objet à partir d'un cache de plus longue durée si vous en aviez besoin, simplement en mettant la logique dans cet endroit pour récupérer votre objet réel.

+0

Cela fonctionnerait de la même manière si je ne me fie pas aux mots-clés de visibilité 'private' et' public' puisque ceux-ci ne sont pas compatibles PHP4, droite? –

+0

Ce serait le cas si vous n'utilisiez que la méthode et non la propriété (puisque c'est toujours le modèle d'objet de php4 public.) Bonne prise par vous! – chelmertz

2

Ce n'est pas une idée terrible à la branche sur un numéro de version php, mais je préférerais quelque chose comme ceci:

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"); 
} 

Si vous vouliez, vous pourriez le rendre plus dynamique:

$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"); 
} 

Un meilleur endroit pour la branche basée sur la version, est la gestion des erreurs - ci-dessus j'utilise des exceptions, qui ne sont pas disponibles en PHP4 :)

+0

Si la condition préalable est PHP4, je ne pense pas que votre méthode échouerait gracieusement si elle essayait d'utiliser Zend_Translate et échouait sur certaines de ses méthodes, puisque la classe probablement (non testée) peut être définie en PHP4. – chelmertz

+0

La classe ne peut pas être définie si elle utilise des mots-clés php5 comme 'private' ou' public'. La version de Zend_Translate que j'avais à portée de main, ça marche. – gnud

Questions connexes