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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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