Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/07/2011, 08h52   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Par défaut Utiliser les classes en PHP (programmation en couches)

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 :
1
2
include'./Persistance/BAL/OperationBAL.php';
include'./Classes/Operation.php';
- Ma BAL : où l'entité de l'IHM est reçue puis transmise à DAL pour être traitée.
Ici j'utilise :
Code :
include'C:\wamp\www\test\Persistance\DAL\OperationDAL.php';
- Ma DAL : où je traite la requête et où j'insère la donnée.

- 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.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 08h59   #2
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Si tu es en PHP5, tu peux utiliser la fonction magique __autoload().
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 09h07   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h23   #4
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Merci beaucoup pour vos réponses.

Bonne journée.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h24   #5
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
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:
driver/connectiondb/mysql/mysql.class.php
driver/connectiondb/postgresql/postgresql.class.php
Code :
1
2
Class Driver_ConnectionDB_MySQL {}
Class Driver_ConnectionDB_PostGreSQL {}
Puis dans l'autoload de remplacer les "_" par des "/".
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h38   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h21   #7
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function __autoload($classname)
{
    if(file_exists('./Classes/'.$classname.'.php'))
    {
        require_once ('./Classes/'.$classname.'.php');
    }
    elseif(file_exists('./Persistance/BAL/'.$classname.'.php'))
    {
        require_once ('./Persistance/BAL/'.$classname.'.php');
    }
    elseif(file_exists('./Persistance/DAL/'.$classname.'.php'))
    {
        require_once ('./Persistance/DAL/'.$classname.'.php');
    }
    else
    {
        throw new Exception('Classe not found');
    }
}
?>
J'ai simplement eu à inclure mon fichier Autoloader.php dans mon IHM et cela fonctionne parfaitement.

Citation:
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).
J'ai rencontré ce cas, c'est vrai il faut bien être vigilent.

Merci pour votre aide.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h35   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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 :
1
2
3
4
5
6
7
8
9
10
11
12
 
$include_path = explode(PATH_SEPARATOR, get_include_path()) + array(
  './Classes/',
  './Persistance/BAL/',
  './Persistance/DAL/',
);
 
if (!set_include_path(implode(PATH_SEPARATOR, $include_path)))
  die('Cannot Start Application: include path defintition failed');
 
spl_autoload_extensions(".class.php, .php");
spl_autoload_register();
Tout simplement
__________________
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 15h43   #9
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Merci bien pour l'info, je ne savais pas du tout. Je vais passer plus de temps la dessus pour approfondir ça alors.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 00h21   #10
ovh
Rédacteur
 
Avatar de ovh
 
Homme
Ingénieur développement logiciels
Inscription : mai 2002
Messages : 3 725
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2002
Messages : 3 725
Points : 6 310
Points : 6 310
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 !
ovh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 08h45   #11
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Code :
1
2
3
4
5
6
7
8
9
10
11
$include_path = explode(PATH_SEPARATOR, get_include_path()) + array(
  './Classes/',
  './Persistance/BAL/',
  './Persistance/DAL/',
);
 
if (!set_include_path(implode(PATH_SEPARATOR, $include_path)))
  die('Cannot Start Application: include path defintition failed');
 
spl_autoload_extensions(".class.php, .php");
spl_autoload_register();
Je ne comprends pas la première partie avec le return, où effectuer ce code ? A quoi correspond-il ?

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.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 10h25   #12
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/07/2011, 10h41   #13
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Ok merci bien, je vais commencer par ça alors.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 09h10   #14
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
J'ai remplacé :

Autoloader.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function __autoload($classname)
{
    if(file_exists('./Classes/'.$classname.'.php'))
    {
        require_once ('./Classes/'.$classname.'.php');
    }
    elseif(file_exists('./Persistance/BAL/'.$classname.'.php'))
    {
        require_once ('./Persistance/BAL/'.$classname.'.php');
    }
    elseif(file_exists('./Persistance/DAL/'.$classname.'.php'))
    {
        require_once ('./Persistance/DAL/'.$classname.'.php');
    }
    else
    {
        throw new Exception('Classe not found');
    }
}
?>
par

Autoloader.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$include_path = explode(PATH_SEPARATOR, get_include_path()) + array(
  './Classes/',
  './Persistance/BAL/',
  './Persistance/DAL/',
);
 
if (!set_include_path(implode(PATH_SEPARATOR, $include_path)))
  die('Cannot Start Application: include path defintition failed');
 
spl_autoload_extensions(".class.php, .php");
spl_autoload_register();
?>
J'obtiens l'erreur suivante :
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.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 09h38   #15
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 10h18   #16
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Au niveau de mon fichier Autoloader.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$include_path = explode(PATH_SEPARATOR, get_include_path()) + array(
        './Classes/',
        './Persistance/BAL/',
        './Persistance/DAL/',
    );
 
    if (!set_include_path(implode(PATH_SEPARATOR, $include_path)))
        die('Cannot Start Application: include path defintition failed');
 
    spl_autoload_extensions(".class.php, .php");
    spl_autoload_register();
Si j'ai bien compris : la variable $include_path va contenir un chemin du type
- 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.

West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 14h07   #17
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 34
Points : 27
Points : 27
Je ne suis pas arrivé à adapter le code pour mon autoload.

Néamoins j'ai modifié mon code initial :
Autoloader.php :
Code :
1
2
3
4
5
6
7
8
 
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/Classes');
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/Persistance/BAL');
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/Persistance/DAL');
function  __autoload($className)
{
    require $className.'.php';
}
Cette implémentation se comporte de façon à peu près similaire que votre implémentation (si j'ai bien compris ).

Merci pour votre aide.
West-tck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 14h01   #18
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Code :
1
2
3
4
5
6
7
8
9
10
11
$include_path = array_merge(explode(PATH_SEPARATOR, get_include_path()), array(
  dirname(__FILE__) . '/Classes/',
  dirname(__FILE__) . '/Persistance/BAL/',
  dirname(__FILE__) . '/Persistance/DAL/',
));
 
if (!set_include_path(implode(PATH_SEPARATOR, $include_path)))
  die('Cannot Start Application: include path defintition failed');
 
spl_autoload_extensions(".class.php, .php");
spl_autoload_register();
Un seul set_include_path suffit. Je m'étais trompé, il fallait un array_merge et non une addition ici
__________________
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
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h57.


 
 
 
 
Partenaires

Hébergement Web