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 :

Méthodes anonymes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Par défaut Méthodes anonymes
    Bonjour,
    Je suis en train de me bricoler un système de gestion de formulaires en PHP. L'idée étant d'automatiser le traitement et l'affichage.

    J'ai des classes définissant les différents types d'input de mon formulaire. Dans ces classes, je stock une fonction anonyme qui va me permettre de valider les données (retournant true si tout va bien, un code d'erreur dans le cas contraire).
    En gros, a fonctionne comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $valid = function($a, $b) {
        return in_array($a, $b) ? true : 'notinarray';
    }
     
    // field est un input créé et initialisé au préalable
    $field->set_validation($valid, array('foo', 'bar'));
    // La validation sera traitée automatiquement plus tard.
    // Le tableau sera passé en argument avec l'entrée utilisateur.
    Ce système fonctionne bien. Mais j'aimerais pouvoir avoir des format de validation que l'utilisateur n'a pas besoin de définir. Et vu que je suis en POO sur ce coup, je me suis dis qu'il serait plus correct de placer ces fonctions dans une classe.
    Je n'ai pas trop l'habitude de manier des objets statiques, ni des fonctions anonymes. Ce qui suit risque de piquer les yeux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class FormValidator {
        public static function inarray($a, $b) {
          return in_array($a, $b) ? true : 'notinarray';
       }
    }
     
    // puis, dans le code de la page de formulaire, toujours avec le même $field :
    $field->set_validation(FormValidator::inarray, array('foo', 'bar'));
    Avec ça, j'obtiens l'erreur : "Fatal error: Undefined class constant 'in' in /opt/lampp/htdocs/framework/test.php"

    Est-ce qu'il est possible de faire ce que je tente de faire ?
    Auriez-vous une autre méthode à me suggérer pour ça ?

    Merci

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par NLS le pingouin Voir le message
    Est-ce qu'il est possible de faire ce que je tente de faire ?
    Merci
    Oui, comme ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    class Validator
    {
        /**
         * @return \Closure
         */
        public static function inArray() 
        {
            return
                function($needle, $haystack)
                {
                    return in_array($needle, $haystack) ?: 'notinarray';
                };
       }
    }
     
    class Form
    {
        /**
         * @param Closure $validator
         * @param array $args
         * @return true|string Error message
         */
        public static function validate(\Closure $validator, array $args)
        {
            return call_user_func_array($validator, $args);
        }
    }
     
    // Exemple:
    $haystack = array('&', 'a', '1');
     
    $test = Form::validate(Validator::inArray(), array('1', $haystack));  // true
    $test = Form::validate(Validator::inArray(), array('abc', $haystack));  // notinarray
     
    ?>
    Après il y a encore d'autres manières pour arriver au même résultat.
    Avec cette approche : tu sépares complètement tes fonctions de validation du reste et tu ne mélanges pas les serviettes et les torchons.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Par défaut
    Ok, c'est pile ce que je cherchais.
    Merci

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

Discussions similaires

  1. Delegate et méthode anonyme
    Par koyot3 dans le forum VB.NET
    Réponses: 25
    Dernier message: 07/06/2011, 10h41
  2. Conversion de C# à vb: méthodes anonymes
    Par AP dans le forum Framework .NET
    Réponses: 1
    Dernier message: 25/11/2008, 21h45
  3. Réponses: 2
    Dernier message: 31/12/2007, 14h50

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