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 :

Définition dynamique de méthode [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 42
    Points
    42
    Par défaut Définition dynamique de méthode
    Bonjour à tous,

    Alors voila j'ai me heurte à un problème de php objet un peu spécifique et j'aurais besoin de vos lumières.

    J'aimerais avoir la possibilité de définir ou redéfinir le contenu d'une méthode pour un objet après l'avoir déclaré. Concrètement je veux avoir une méthode checkData() qui effectue un test différent sur chaque instance d'un objet.

    Ce qui donnerait lors de l'utilisation de l'objet en question :

    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
    $data1 = new MonObjet($arg1);
     
    $data1->recuprétation();
     
    * définition de la méthode checkData() pour $data1 *
     
    $data2 = new MonObjet($arg2);
     
    $data2->recuprétation();
     
    * définition de la méthode checkData() pour $data2 *
     
    $data3 = new MonObjet($arg3);
     
    $data3->recuprétation();
     
    * méthode checkData() par défaut pour $data3 *
     
    ...
    ...
    ...
     
    foreach($datas as $data)
    {
         if(!$data->checkData())
         {
               $allValid = false;
         }
    }

    Cela est il possible d'une manière ou d'une autre ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    c'est faisable en utilisant les fonctions anonymes :
    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
    <?php
     
    class Foo
    {
        private $check_data;
     
        public function setCheckData(\Closure $p)
        {
            $this->check_data = $p;
        }
     
        public function compute()
        {
            $f = $this->check_data;
            if (is_callable($f))
            {
                return $f();
            }
        }
    }
     
    $a = new Foo();
    $a->setCheckData(function() { return 1 + 1; });
     
    $b = new Foo();
    $b->setCheckData(function() { return 10 + 10; });
     
     
    $x = $a->compute(); // x = 2
    $y = $b->compute(); // y = 20
     
    ?>
    Un peu de lecture ici
    Il faut surtout bien saisir la notion de contexte d'une fonction anonyme, y a aussi ça à lire (plus technique et merci à l'ami Benjamin Delespierre pour cette présentation).

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    Merci, je connaissais le principe des classes anonymes en Java mais je ne savais pas qu'elles existaient en PHP. Le fonctionnement semble tout de même bien différent de ce à quoi j'ai été habitué.

    Je vais lire tout ca.

    [edit] En fait après avoir rapidement regardé ca se rapproche pas mal des closures en JS non ?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Dans l'idée générale, oui, c'est assez proche. Après au niveau de l'implémentation, y a quand même de sacrés différences

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

Discussions similaires

  1. Bouton dynamique et méthode
    Par wind_vinch dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/04/2011, 18h27
  2. [Reflection] Lancer dynamiquement une méthode donnée d'un objet
    Par Diablo_22 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 06/09/2007, 09h21
  3. Définition dynamique de variables
    Par Cris++ dans le forum Général VBA
    Réponses: 7
    Dernier message: 12/05/2007, 15h28
  4. Appel dynamique de méthode
    Par PereCastor dans le forum C++
    Réponses: 3
    Dernier message: 14/11/2006, 16h25
  5. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 14h47

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