Question

Je sais que PHP4 est « mort », mais il y a environ deux douzaines de nos clients qui sont encore situés sur des serveurs où PHP4 est utilisé, et nous n'obtenir des mises à niveau du serveur jusqu'à environ un an ou deux.

Je suis sur le point de commencer à travailler sur refactoring et l'amélioration de notre cadre de Web de base, qui est maintenant codé pour le plus petit dénominateur commun, PHP4 (par exemple, toutes les classes ont var $ foo).

Je ne l'ai jamais fait aucun OO en PHP4 mais je me demande si je devrais faire différentes classes pour les versions de PHP, et en fonction de la version de PHP inclus cette version? L'inconvénient est que je me rends compte que je dois mettre à jour deux endroits si une mise à jour a été faite, et il peut y avoir aucun avantage réel à elle.

Donc, si quelqu'un pouvait fournir des conseils sur la façon dont ils prennent en charge les versions PHP existantes, je serais très heureux.

Était-ce utile?

La solution

La plupart des PEAR est encore PHP4 ciblage, de sorte que vous pouvez l'utiliser comme un « cadre ». Je crois et CodeIgnitor sont drupal aussi cibler encore PHP4 (Peut-être CakePHP aussi?).

Le plus gros problème avec des objets et PHP4 est que les objets sont passés par valeur, vous devez donc utiliser des références pour obtenir la sémantique habituelle que la plupart des autres langues ont des objets (y compris php5). Vous devez être très prudent d'attribuer toujours une référence à des objets. Dans le cas contraire il sera cloné implicitement. Ceci est fastidieux et très difficile à déboguer si vous gâcher. En outre, il fera votre code incompatible avec php5. Par exemple:.

Création d'un objet:

$foo =& new Foo();

Le passage d'un objet comme argument d'une fonction:

class Bar {
  function cuux(&$foo) {
  }
}
$bar =& new Bar();
$bar->cuux($foo);

Puisque les arguments sont des références, vous ne pouvez pas passer une constante. Donc, si vous devez passer NULL au lieu d'un objet, vous devez attribuer la valeur NULL à une variable locale d'abord. Par exemple:.

$bar =& new Bar();
$foo = null;
$bar->cuux($foo);

De retour des objets à partir d'une fonction:

class Bar {
  function &doink() {
    $foo =& new Foo();
    return $foo;
  }
}
$bar =& new Bar();
$foo =& $bar->doink();

Notez que vous devez attribuer foo $ à une variable, ce qui rend impossible de retourner le résultat d'une autre fonction directement. Par exemple. cela est illégal:

class Bar {
  function &doink() {
    return $this->foo->doink();
  }
}

Il devrait être:

class Bar {
  function &doink() {
    $tmp =& $this->foo->doink();
    return $tmp;
  }
}

Mlle juste un de ces esperluette et vous êtes grillé. Aussi, assurez-vous que vous avez une très bonne compréhension de la façon dont se comportent les références -. Ils ne sont pas exactement intuitive

Autres conseils

Assurez-vous que vos classes sont écrits dans la syntaxe PHP 4, i.e.:.

class MyClass {
    var $my; // PHP4 style declaration
    function MyClass() { // PHP4 constructor     
      $this->__construct(); // calling PHP5 constructor
    }
    function __construct() { // PHP5 constructor       
       $this->my = 1;
       ...other initialization stuff...
    }
    ...
}

Il fonctionne bien dans les versions PHP .

Je peux à peine imaginer quelque chose de me développer pour PHP4, mais si je devais un jour je serais probablement faire deux codebases garder code php5 propre et agréable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top