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 :

callback dynamique vs call_user_func


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Points : 242
    Points
    242
    Par défaut callback dynamique vs call_user_func
    Bonjour,

    Je suis confronté à un problème de callback.

    J'ai une classe qui contient une possibilitée de callback.

    J'aimerais utiliser le callback dans une autre classe de manière dynamique. i.e en tenant compte de l'état de l'objet.

    L'exemple qui suit(fonctionnel) illustre ce que j'aimerais bien faire, sans être pour autant utile :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    $test = new A;
     
    $test->test();
     
    class A 
    {       
    	     public $param;
     
             public $c;
     
            protected function A1($param)
            {
            	if($this->param == $param){return true;}
     
             }
     
            public function __construct()
            {
               $this->c = new B;
               $this->c->callbacks['A'] = 'A1';
     
            }
            public function test()
            {
            	$this->c->B1();
            }
    }
     
    class B
    {
    	public $param = true;
        public $callbacks = array();
     
        public function B1() 
        {
              foreach($this->callbacks as $object => $callback)
              {
                    call_user_func(array($object,$callback),$this->param);
              }    
         }
    }
    ?>
    Comme call_user_func appelle uniquement des fonctions statiques, le code ci-dessus présente une erreur à cause de " protected function A1", si je lui associe la syntaxe "static function A1" alors je recois une erreur car $this n'est plus d'actualité. Pourtant j'aimerais utiliser une valeur connue lors ( ou apres) l'instanciation de A.

    Existe-t'il une autre fonction pour cela, ou est-ce une dérive intellectuelle de ma part ?

    merci d'avance
    Johan

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    call_user_func peut parfaitement appeler une méthode d'instance comme de classe. La visibilité (public contre protected/private) c'est tout autre chose, que vous ne pouvez passer outre (normalement - ça n'aurait plus d'intérêt sinon d'en avoir).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Test {
        public function instance() {
            echo __METHOD__;
        }
     
        public static function classe() {
            echo __METHOD__;
        }
    }
     
    $t = new Test;
    call_user_func(array($t, 'instance'));
    call_user_func(array('Test', 'classe'));
    Test::instance
    Test::classe
    En protected (depuis la classe courante ou une classe fille)/private (la classe courante uniquement), c'est normal que ça "crash" si la visibilité imposée n'est pas respectée.

  3. #3
    Membre actif Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Points : 242
    Points
    242
    Par défaut
    merci pour la réponse,

    En fait j'ai fait une erreur de débutant( que je suis ), j'ai pour habitude de restreindre au maximum l'aspect de visibilité pour ensuite assouplir si besoin est.

    J'avais d'abord essayé l'option utilisant des fonctions statiques, vu mon besoin j'avais rajouté l'instance dans call_user_func pour profiter de la méthode d'instance.

    Seulement comme ma fonction n'était pas lisible par l'autre classe cela m'a généré une erreur, et je l'ai mise sur le compte de call_user_func

    Erreur résolue donc... ca aide bien d'avoir une vue extérieure pour "retirer le nez du tableau " .

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

Discussions similaires

  1. Pushbuttons et edit texts créés dynamiquement - Appel d'un Callback
    Par ontheroadagain dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 09/06/2009, 15h19
  2. Réponses: 4
    Dernier message: 30/03/2006, 16h20
  3. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 16h19

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