2010-12-12 6 views
1

J'écris une application de manière modulaire, donc je peux éventuellement réutiliser certains des composants. J'ai également écrit des fonctions utilitaires partagées entre différents composants. Par exemple, si j'ai des classes A (dans A.php), B (dans B.php), et C (dans C.php), et une fonction f (dans utils.php), et cette fonction est utilisée dans les deux A, B et C, comment organise-t-on le code?Comment organiser le code PHP?

À des fins de test, je lance séparément A.php, B.php et C.php, donc j'ai besoin d'inclure utils.php dans chacun d'entre eux. Est-ce que require_once 'utils.php' dans les trois fichiers est une bonne solution? J'ai entendu dire qu'il pourrait y avoir un problème de performance mineur avec l'utilisation de require_once. Ou devrais-je écrire un test.php distinct, où j'importerais tous les fichiers dont j'ai besoin, et j'utiliserais ce code pour tester au lieu d'écrire des tests dans des fichiers de classe réels?

+1

Connexes: http://stackoverflow.com/questions/1812472/in-a-php-project-how-do-you-store-access-and-organize-your-helper-objects –

+0

vous devez inclure votre Utils dans un fichier bootstrap, comme un avec les paramètres de DB et d'autres choses. –

+0

Notez également que l'opérateur require_once (ainsi que d'autres choses _once) est une béquille laide, pour ceux qui ne peuvent pas contrôler le flux de leur programme –

Répondre

1

Si vous programmez des objets orientés, vous devez également placer la fonction f dans une classe; une classe utils dans votre fichier utils.php. Require_once peut avoir un impact minimal sur les performances car il devra se rappeler et vérifier si un fichier a déjà été inclus, mais c'est le meilleur moyen d'inclure des fichiers, pour s'assurer que vous avez les fichiers dont vous avez besoin. Vous pouvez ensuite inclure toutes les dépendances de ce fichier/classe.

Les tests ne doivent bien entendu pas figurer dans vos fichiers de classe. Je ne comprends pas tout à fait si toutes vos classes sont pour le test maintenant ou si vous testez vos classes ...

+0

Oui, je suis en train de tester mes cours. J'ai typiquement une ligne de si défini ('STDIN') et écris mon code de test avec assert() dans le bloc if. – hayavuk

0

En ce qui concerne require_once:

Oui, il a des problèmes de performance. Lorsque vous êtes sûr d'inclure le fichier une seule fois, ne le mettez pas, c'est une vérification inutile.

Quelques conseils:

  • Essayez d'utiliser absolute_path lorsque vous appelez besoin
  • La différence de temps entre require_once() par rapport à require() est généralement pas significatif, à l'exception d'une application très importante que a des centaines d'appels require *(), dans ce cas, il est vraiment lent
  • Utilisez un cache d'opcode, comme APC!
+0

J'essaie d'utiliser dirname (__ FILE__) le cas échéant. Et dans le code d'amorçage, je définis une variable $ BASEPATH qui contient le nom du répertoire bootstrap.php qui est placé dans la racine du projet et qui est toujours exécuté. – hayavuk

+0

S'assurer de faire moins de vérifications n'est pas vraiment une bonne idée. :) Vous ne savez jamais ce qui va arriver ou ce que les autres font avec votre code. – Kissaki

3

Tout d'abord, require_once n'est certainement pas "trop" lent pour exécuter vos tests. Rappelez-vous, l'optimisation prématurée est la racine de tous les maux. Oui, il y a des frais généraux, mais à moins que cela ne provoque des erreurs ou ne ralentisse votre environnement de production, ne vous embêtez pas. Mesurer, mesurer la mesure.

Une bonne stratégie que j'ai tendance à utiliser est similaire à celle de Zend Framework.

Mes noms de classe sont basés sur ma structure de répertoire. Par exemple, une classe nommée Http_Client_Curl serait lokated dans le répertoire suivant:

Http/Client/Curl.php 

Avec une telle structure, il est très facile et pratique à utiliser auto loading. Voir spl_autoload_register. Cela signifie que vous pouvez laisser PHP inclure automatiquement tous les fichiers et toutes les classes selon vos besoins, selon une convention assez simple.

+0

+1 pour vos conseils sur l'optimisation prématurée! ;) – none

2

Si vous parlez en termes de PHP 5.3, je crois que namespaces et auto-loading s'intégreraient parfaitement dans votre application. D'autre part, le code hérité a tendance à être organisé en "bibliothèques" ou "inclut" avec un noyau "includes.inc.php" qui utilise la méthode usine, ou divers autres design pattern, pour charger les classes.

Questions connexes