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 :

"include" et "require" dans une classe


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 23
    Points
    23
    Par défaut "include" et "require" dans une classe
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    class A {
        fonction A () {
            require_once('monfichier.php');
        }
    }
     
    $class = new A();
     
    echo $mavar;
    echo MA_CONST;
    ?>
    $mavar & MA_CONST sont déclarées dans le fichier "monfichier.php"...
    Je n'ai accès qu'à "MA_CONST" hors de la classe.

    Comment puis-je remédier à ce problème ?

    Bien évidement, si je met l'include dans la class c'est parce que j'ai des contraites, je ne peut pas le sortir de la classe... Enfin, du moins, je connais le nom du fichier à inclure que une fois la classe initiée...

    Merci à vous !
    Cordialement, Samuel.

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    étant donné que l'existence de la classe A est soumise à l'existence de $mavar, $mavar devrait être membre du constructeur de la classe A.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A {
        private $ma_var;
        fonction __construct ($var) {
            $this->ma_var = $var;
        }
    }
     
    $mavar = 0;
    $class = new A($mavar);

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    il est normal que tu n'aies pas accès à $mavar : elle reste locale à la méthode A(), et est détruite quand celle-ci se termine (pour la constante c'est différent, define() crée une constante de portée globale). Pour accéder à son contenu, il faut la mémoriser dans une propriété de la classe, éventuellement du même nom :
    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
    <?php
     
    class A {
        public $mavar;
        fonction A () {
            require_once('monfichier.php');
            $this->mavar = $mavar;
        }
    }
     
    $obj = new A();
     
    echo $obj->mavar;
    echo MA_CONST;
    ?>
    J'imagine que tu as de bonnes raisons pour procéder de la sorte, mais c'est quand même pas top comme construction...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    ThomasR, un "&" aurait été nécessaire dans la déclaration de la fonction "__construct" pour que ça marche bien

    Grand-Père ( ), cette méthode marche, certes, mais dans le cas où j'ai environ une centaine de variables (que je ne connais pas forcément à l'avance), je fait comment ?

    Ne serait-il pas possible d'inclure le fichier à l'endroit où la classe à été construite ?

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,
    Citation Envoyé par Samuel2202 Voir le message
    ThomasR, un "&" aurait été nécessaire dans la déclaration de la fonction "__construct" pour que ça marche bien
    pourquoi donc ?
    Citation Envoyé par Samuel2202 Voir le message
    Grand-Père ( ), cette méthode marche, certes, mais dans le cas où j'ai environ une centaine de variables (que je ne connais pas forcément à l'avance), je fait comment ?

    Ne serait-il pas possible d'inclure le fichier à l'endroit où la classe à été construite ?
    Y a quand même une zone d'ombre : tu n'as pas le droit de sortir le include de la classe, mais tu dois accéder aux variables dans le script global ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par jml94 Voir le message
    pourquoi donc ?
    Pour qu'un changement de la variable dans la fonction change la variable dans le script global...
    Citation Envoyé par jml94 Voir le message
    Y a quand même une zone d'ombre : tu n'as pas le droit de sortir le include de la classe, mais tu dois accéder aux variables dans le script global ?
    C'est ça

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    De toutes façons, je pense que le fichier inclus peut ressembler à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $var1 = "foo";
    $var2 = "bar";
    $var3 = 1234;
    En d'autres termes, cela définira, comme le disait GrandFather, des variables locales au constructeur, et non pas des attributs de l'instance, qui devraient être déclarés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->var1 = "foo";
    $this->var2 = "bar";
    $this->var3 = 1234;
    Donc je ne vois pas le "killer tip" qui peut te sortir de la situation.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Si ton fichier inclus ne contient que des déclarations de variable et pas d'autre code, tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function A() {
      $include = file_get_contents('monfichier.php');
      eval(preg_replace('/\$(.*?)(\s*=\s*.*?;)/is', '$this->\1\2', $include));
    }
    Enfin, on reste quand même dans de la grosse bidouille...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. include dans une classe, c'est possible ?
    Par a028762 dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2013, 10h40
  2. Réponses: 1
    Dernier message: 04/12/2012, 15h41
  3. Réponses: 1
    Dernier message: 06/11/2009, 00h20
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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