|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Bonjour,
J'ai 4 couches, je prends l'exemple d'une seule entité : - Mon IHM : où je construit mon entité via un formulaire et où je l'envoie à la BAL. Dans l'interface j'utilise : Code :
Ici j'utilise : Code :
include'C:\wamp\www\test\Persistance\DAL\OperationDAL.php'; - Ma couche métier : où est déclarée mon entité. Pourriez-vous me dire si c'est correct de procéder ainsi où si je peux passer par un autre moyen pour utiliser mes classes ? (Les include en cascade me dérangent un peu en fait). Merci d'avance. |
||
|
|
00
|
|
|
#2 |
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
Si tu es en PHP5, tu peux utiliser la fonction magique __autoload().
|
|
|
10
|
|
|
#3 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Un mot d'explication.
En PHP, on a souvent tout un tas de classes à utiliser mais on ne peux pas s'amuser à toutes les charger pour des raisons évidentes de performances. PHP est capable, au travers de l'autoloader, de charger dynamiquement les classes, c'est à dire au moment où elles sont effectivement utilisées. Pour cela, on va décrire toutes nos classes dans des fichiers séparés (une bonne pratique consiste à nommer ces fichier <nom_classe>.class.php). L'autoloader, lorsqu'il est invoqué va regarder dans l'include path de PHP s'il trouve un fichier correspondant à cette classe. Son comportement est entièrement surchargeable par une fonction ou méthode et il est même possible de spécifier les extension de fichiers à reconnaitre (voire une série d'extensions possibles). Par exemple, une surcharge d'autoload pourrait aller charger des classes depuis un package PHAR au lieu de regarder l'include path. L'autoloader peut également être appelé explicitement en invoquant spl_autoload. Dans le cadre de PHP 5.3 et l'ajout des namespaces, la donne change: plusieurs classe peuvent avoir le même nom si elles ne sont pas dans le même namespace. On peut donc mettre nos classes dans une arborescence (qui correspond à l'arborescence de nos namespaces) et surcharger l'autoloader pour qu'il trouve le "chemin" de la classe à charger. Par exemple: si on essaie de charger \foo\bar\MaClasse, l'autoloader pourrait aller voir dans /var/www/lib/foo/bar/MaClasse.class.php. Il me semble que l'autoloader natif est incapable d'une telle chose. A lire: http://php.net/manual/en/language.oop5.autoload.php http://www.php.net/manual/en/functio...d-register.php http://www.php.net/manual/en/functio...extensions.php http://www.php.net/manual/en/function.spl-autoload.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Merci beaucoup pour vos réponses.
Bonne journée. |
|
|
00
|
|
|
#5 | |||
![]() ![]() Josselin Développeur Web Inscription : janvier 2004 Messages : 9 050 ![]() |
A savoir aussi, l'autoload se déclenche si et seulement si le fichier de ta classe n'a pas pu être trouvé avant. Donc si tu as laissé un include de ta classe par mégarde, l'autoload ne chargera pas une deuxième fois le fichier (ce qui provoquerait une erreur fatale de classe déjà définie).
Une technique de chargement des fichiers (utilisée notamment dans des frameworks comme ZendFramework) est d'appeler les classes en fonction du dossier dans lequel elle se trouve. Par exemple : Citation:
Code :
|
|||
|
|
00
|
|
|
#6 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Zend Framework utilise cette notation pour contourner le manque de namespace dans les environnements PHP < 5.3 mais ça donne des noms de classes à rallonge. Personnellement j'utilise la notation Java (ce qui est fait pour les classes natives du langage par ailleurs).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#7 | |||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
J'utilise également la notation JAVA qui est plus légère à mon sens
J'ai pu tester __autoload() , voici le code de la fonction : Fichier Autoloader.php : Code :
Citation:
Merci pour votre aide. |
|||
|
|
00
|
|
|
#8 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Tu verras si tu fais un profiling que les file_exists sont très couteux en cycle CPU (chez moi ça représente environ 30% pour un appli de moyenne envergure alors imagine avec 500 classes).
Tu peux te servir du retour de la directive include qui renvoie un booléen en faisant: Tu peux réduire tout ça: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
10
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Merci bien pour l'info, je ne savais pas du tout. Je vais passer plus de temps la dessus pour approfondir ça alors.
|
|
|
00
|
|
|
#10 |
![]() ![]() Ingénieur développement logiciels Inscription : mai 2002 Messages : 3 725 ![]() |
Pourquoi réinventer la roue et ne pas utiliser un framework ?
__________________
Tutoriels sur les UPS, e-commerce, PHP, critiques de livres... Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles. Je n'ai rien à voir avec la société www.ovh.com ! |
|
|
00
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Code :
Pour la deuxième partie du code je n'arrive pas à saisir non plus, y aurait-il une partie du cours qui traite de cela, où pourriez-vous me donner quelques explications (car je débute vraiment). Merci d'avance pour vos réponses. |
||
|
|
00
|
|
|
#12 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Tout est expliqué dans le manuel. Dans mon exemple on se sert du comportement classique de l'autoloader - comportement qui consiste à chercher dans l'include path de PHP un fichier portant le nom de la classe et qui à une extension qui correspond aux extensions autorisées.
Donc résumons nous: 1 - Définition de l'include path 2 - Définition de(s) extension(s) autorisée(s) 3 - Activation de l'autoloading La première partie servait à montrer comment faire un include de manière à ne pas avoir à se servir de file_exists. Elle n'est pas utile à la compréhension de mon exemple.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
20
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Ok merci bien, je vais commencer par ça alors.
|
|
|
00
|
|
|
#14 | ||||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
J'ai remplacé :
Autoloader.php : Code :
Autoloader.php : Code :
Fatal error: spl_autoload() [function.spl-autoload]: Class OperationBAL could not be loaded in C:\wamp\www\Moprojet\IHM\AfficherOperation.php on line 21 Faut-il mettre ce bout de code dans une fonction ? ou est-ce que l'implémentation que j'en ai fait est incorrecte ? Je bloque un peu à ce niveau Merci pour votre aide. |
||||
|
|
00
|
|
|
#15 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Vérifie bien que les paths relatifs dans l'include path sont valides. Tu n'as pas besoin de mettre tout ça dans une fonction, tu peux le mettre directement dans le bootstrap de ton application.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#16 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Au niveau de mon fichier Autoloader.php :
Code :
- C:/wamp/www/Monprojet/Classes/ - C:/wamp/www/Monprojet/Persistance/BAL/ - C:/wamp/www/Monprojet/Persistance/DAL/ ? Car j'ai lu la doc mais je ne saisit pas très bien comment utiliser ces fonctions. Au niveau du bootstrap : à quoi correspond-il ? pour le moment j'ai un fichier Autoloader.php que j'inclut dans tous les fichiers qui utilisent des classes. |
||
|
|
00
|
|
|
#17 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 34 ![]() |
Je ne suis pas arrivé à adapter le code pour mon autoload.
Néamoins j'ai modifié mon code initial : Autoloader.php : Code :
Merci pour votre aide. |
||
|
|
00
|
|
|
#18 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
Copyright © 2000-2012 - www.developpez.com