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 :

[POO] fonction dans une méthode passation d'un attribut ou de $this


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut [POO] fonction dans une méthode passation d'un attribut ou de $this
    Bonjour à tous,

    J'ai un petit problème que je ne sais résoudre...

    Je possède une méthode d'une classe qui contient elle même une fonction de callback utile uniquement à cette méthode.

    Un exemple simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class maClasse
    {
        private $attr = 10;
        private function maMethode()
        {
            function maFonction($attribut)
            {
               // Ici j'ai besoin de pouvoir accéder à $this->attr
            }
            // Ici un preg_replace_callback() se servant de maFonction()
        }
    }
    Mon problème est que je ne sais pas comment accéder dans maFonction() à $this.

    Je ne peux passer $this->attr dans les arguments de maFonction(), à moins qu'il n'y est un moyen de le faire que je ne connaisse pas.
    Je ne peux mettre $this->attr en global, php me jette un fatal error, ce qui est complètement logique.

    Ma question donc comment faire pour que maFonction() puisse accéder à $this ?

  2. #2
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    En passant a MaFonction() une référence vers l'objet de base...

    Ca marche ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class maClasse
    {
        private $attr = 10;
        private function maMethode()
        {
            function maFonction($attribut, $MyObj = $this)
            {
               echo $MyObj->attr;// Ici j'ai besoin de pouvoir accéder à $this->attr
            }
            // Ici un preg_replace_callback() se servant de maFonction()
        }
    }

  3. #3
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Non justement, on ne peut pas faire ça.

    Parse error: syntax error, unexpected T_VARIABLE


  4. #4
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    bon bhé faut enlever le = $this de la déclaration de la fonction, et le passer a la main quand tu appels ta methode...

    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
    class maClasse
    {
        private $attr = 10;
        private function maMethode()
        {
            function maFonction($attribut, $MyObj)
            {
               echo $MyObj->attr;// Ici j'ai besoin de pouvoir accéder à $this->attr
            }
            // Ici un preg_replace_callback() se servant de maFonction()
            maFonction('xxx', $this);    
     
         }
     
    }

  5. #5
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Oui merci, sauf que j'ai besoin d'utiliser cette fonction dans mon preg_replace_callback()

    J'aurais pu le faire avec call_user_func() mais cela ne va pas car je n'ai plus la variable correspondant à mon pattern.

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace_callback('lemasque', call_user_func('maFonction', $this->attr), $sujet);
    Je n'ai plus le pattern qui est passé en paramètre de ma fonction de callback, et donc je me retrouve avec un seul argument passé.

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 701
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 701
    Par défaut
    essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class maClasse
    {
        private $attr = 10;
     
        private function maMethode()
        {
            preg_replace_callback('lemasque', array($this, 'maMethodeCallback'), $sujet);
        }
     
        private function maMethodeCallback($arg)
        {
            // accès à $this->attr
        }
    }

Discussions similaires

  1. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 20h05
  2. Réponses: 2
    Dernier message: 31/12/2007, 14h50
  3. [POO] Deux paramètres dans une méthode ?
    Par SBL69 dans le forum Langage
    Réponses: 2
    Dernier message: 18/09/2007, 12h54
  4. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2007, 00h04
  5. [POO] Fonctions dans une classe abstraite
    Par Seth77 dans le forum Langage
    Réponses: 4
    Dernier message: 27/06/2006, 14h21

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