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 et callback


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut POO et callback
    Bonjour à tous,

    Je n'arrive pas à résoudre une erreur qui se glisse dans mon code, quand bien même je connais la ligne qui est fautive. Voici les bouts de codes incriminés :

    Méthode récupérant les informations de connexion à la bdd depuis un fichier
    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
    private function recupererInformationsBDD() {
     
        $informations_bdd =
    	    //Combine deux tableaux (indices+valeurs)
    	    array_combine(
    	        /*Tableau des cles/indices*/
    	        array('type', 'hote', 'nom', 'identifiant', 'mot_de_passe'),
                    /*Tableau des valeurs*/
                    //Filtre du tableau via la fonction utilisateur TriTab
                    array_filter(
                        //Applique la fonction trim au tableau renvoyé par le file
                        array_map(
                    	'trim', 
    	            	file('../modules/informations-bdd')),
                        'TriTab') //Ligne fautive
    	    );		
     
        return $informations_bdd;
    }
    Voici maintenant la méthode TriTab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function TriTab($str){
     
        return strpos($str, '#') !== 0 AND strlen($str) > 0;
    }
    Et voici maintenant l'erreur affichée :
    Warning: array_filter() expects parameter 2 to be a valid callback, function 'tritab' not found or invalid function name in D:\Workspace\www-dev\private\blog\modules\compte.php on line 97


    Comme l'atteste l'image, recupererInformationsBDD ne trouve pas la fonction callback TriTab. Les deux se trouvent néanmoins dans la même classe "compte". Une idée ?

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_filter(..., array($this, 'TriTab'))
    Si la callback est une méthode d'instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array($objet, $nomDeLaMethode)
    Si la callback est une méthode de classe (static) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array($nomDeLaClasse, $nomDeLaMethode)
    PHP >= 5.2.3 permet aussi directement "$nomDeLaClasse::$nomDeLaMethode"

    Voir la documentation de call_user_func.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Comme indiqué, TriTab est une méthode d'instance (elle n'est pas static).

    J'ai essayé de remplacer la syntaxe 'TriTab' par les syntaxes suivantes sans succès :

    Erreur :
    ( ! ) Catchable fatal error: Object of class compte could not be converted to string in D:\Workspace\www-dev\private\blog\modules\compte.php on line 97
    ---------

    Erreur :
    ( ! ) Notice: Undefined variable: TriTab in D:\Workspace\www-dev\private\blog\modules\compte.php on line 97
    ----------

    Erreur :
    ( ! ) Fatal error: Access to undeclared static property: compte::$TriTab in D:\Workspace\www-dev\private\blog\modules\compte.php on line 98
    N.B. : de même en déclarant la méthode static.

    #########

    L'application de la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array_filter
    	(
    		array_map
    		(
    		        'trim', 
    		        file('../modules/informations-bdd')
    		 ),
    		 $TriTab // idem pour array($this,$TriTab)
    	)
    donne le code erreur suivant :
    ( ! ) Warning: array_filter() expects parameter 2 to be a valid callback, no array or string given in D:\Workspace\www-dev\private\blog\modules\compte.php on line 98
    Voici la classe en entier :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    <?php
     
    /**
     *
     * Auteur : *** ***
     * Aka : G4llic4
     * Courriel : g4llic4@gmail.com
     *
     * Fichier : compte.php
     *
     * Classe : compte
     * Objectif : gérer la creation et l'authentification d'un compte vers
     * une base de données.
     *
     */
     
    class compte {
     
    	private $nom_utilisateur;
    	private $mot_de_passe;
    	private $compte_bdd_connexion;
     
    	public function __construct() {
     
    		$informations_bdd = $this->recupererInformationsBDD();
    		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    		try {
     
    			$this->compte_bdd_connexion = new PDO(
    			$informations_bdd['type']
    			.':host='.$informations_bdd['hote']
    			.';dbname='.$informations_bdd['nom'],
    			$informations_bdd['identifiant'], $informations_bdd['mot_de_passe'],
    			$pdo_options
    			);
     
    		}
    		catch (Exception $e) {
    			die('Erreur : ' . $e->getMessage());
    		}
    	}
     
    	/**
    	 * Recupere les informations de connexion � la base de données depuis un fichier source.
    	 * Fichier source : ./informations-bdd
    	 */
    	private function recupererInformationsBDD() {
     
    		$informations_bdd =
    		    //Combine deux tableaux (indices+valeurs)
    		    array_combine
    		    (
    		        /*Tableau des cles/indices*/
    		        array('type', 'hote', 'nom', 'identifiant', 'mot_de_passe'),
    		        /*Tableau des valeurs*/
    		        //Filtre du tableau via la fonction utilisateur TriTab
    		        array_filter
    		        (
    		            //Applique la fonction trim au tableau renvoyé par le file
    		            array_map
    		            (
    		            	'trim', 
    		            	file('../modules/informations-bdd')
    		            ),
    		            array($this,$TriTab)
    		         )
    		    );		
     
    		return $informations_bdd;
    	}
     
    	public function TriTab($str){
     
    		return strpos($str, '#') !== 0 AND strlen($str) > 0;
    	}
     
    	public function creer($login, $mdp) {
     
    		$this->nom_utilisateur = $login;
    		$this->mot_de_passe = $mdp;
     
    		$requete_preparee = $this->preparerRequeteInsertion();
    		$this->executerRequeteInsertion($requete_preparee);
     
    	}
     
     
    	private function preparerRequeteInsertion() {
    		$requete_preparee = $this->compte_bdd_connexion->prepare('
    				INSERT INTO user (user_name, user_password)
    				VALUES (:pseudo, :mdp)
    			');
     
    		return $requete_preparee;
    	}
     
     
    	private function executerRequeteInsertion($requete_preparee) {
    		$requete_preparee->execute(array(
    				'pseudo' => $this->nom_utilisateur,
    				'mdp' => $this->mot_de_passe
    		));
    	}
     
    }
     
    ?>

  4. #4
    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
    C'est ce qui est en gras qu'il faut utiliser. La suite n'est qu'explication sur le principe des callback en OO. Et c'était volontairement sous la forme de variables pour montrer que ça peut être totalement dynamique.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par julp Voir le message
    C'est ce qui est en gras qu'il faut utiliser. La suite n'est qu'explication sur le principe des callback en OO. Et c'était volontairement sous la forme de variables pour montrer que ça peut être totalement dynamique.
    Merci de ton aide, je vais tâcher de répondre dans l'ordre

    Ce qui est en gras ? Tu veux parler du message d'erreur ? Je sais lire, je ne vois néanmoins pas en quoi TriTab n'est pas une fonction callback valide (ou bien ne la trouve-t-il pas ?).

    D'autre part, je ne vois pas comment utiliser la fonction call_user_func sur ce TriTab. En effet, je veux bien écrire call_user_func('TriTab', ...) mais que mettre en deuxième argument ? Puisqu'ici c'est un filtre passant par chacune des valeurs du tableau et non une simple variable.

    EDIT : Ah ok, je viens de voir le gras et... ça à l'air de passer. Je te confirme ça. Merci

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    C'est bon

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

Discussions similaires

  1. [PHP 5.3] [POO] Fonction de callback via assesseurs
    Par Xunil dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2011, 17h46
  2. compatibilité POO avec un callback dans un uicontrol
    Par oodbae_adriano dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/08/2011, 15h33
  3. Réponses: 4
    Dernier message: 14/09/2006, 12h25
  4. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04
  5. lier un cube à un objet (POO)
    Par Hypnos dans le forum OpenGL
    Réponses: 12
    Dernier message: 26/08/2003, 21h46

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