IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Utiliser les classes en PHP (programmation en couches)


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Si tu es en PHP5, tu peux utiliser la fonction magique __autoload().

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Merci beaucoup pour vos réponses.

    Bonne journée.

  5. #5
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    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 :
    driver/connectiondb/mysql/mysql.class.php
    driver/connectiondb/postgresql/postgresql.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Class Driver_ConnectionDB_MySQL {}
    Class Driver_ConnectionDB_PostGreSQL {}
    Puis dans l'autoload de remplacer les "_" par des "/".

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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).

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    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.

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Merci bien pour l'info, je ne savais pas du tout. Je vais passer plus de temps la dessus pour approfondir ça alors.

  10. #10
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    Par défaut
    Pourquoi réinventer la roue et ne pas utiliser un framework ?

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    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 !

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Ok merci bien, je vais commencer par ça alors.

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    J'ai remplacé :

    Autoloader.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  15. #15
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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.

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Au niveau de mon fichier Autoloader.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.


  17. #17
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    Je ne suis pas arrivé à adapter le code pour mon autoload.

    Néamoins j'ai modifié mon code initial :
    Autoloader.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  18. #18
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Taglibs] Utiliser les classes css ?
    Par PeteMitchell dans le forum Struts 1
    Réponses: 4
    Dernier message: 05/05/2007, 01h31
  2. [POO] Pourquoi utiliser les classes ?
    Par GregPeck dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 15h18
  3. php:comment utiliser les sessions en php
    Par feten dans le forum Langage
    Réponses: 3
    Dernier message: 19/11/2005, 16h17
  4. Réponses: 3
    Dernier message: 23/08/2004, 17h49
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo