Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2011, 18h27   #1
Invité régulier
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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 :
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 :
1
2
3
4
public function TriTab($str){
 
    return strpos($str, '#') !== 0 AND strlen($str) > 0;
}
Et voici maintenant l'erreur affichée :
Citation:
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 ?
g4llic4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 18h31   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
array_filter(..., array($this, 'TriTab'))
Si la callback est une méthode d'instance :
Code :
array($objet, $nomDeLaMethode)
Si la callback est une méthode de classe (static) :
Code :
array($nomDeLaClasse, $nomDeLaMethode)
PHP >= 5.2.3 permet aussi directement "$nomDeLaClasse::$nomDeLaMethode"

Voir la documentation de call_user_func.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 01h11   #3
Invité régulier
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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 :
Citation:
( ! ) 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 :
Citation:
( ! ) Notice: Undefined variable: TriTab in D:\Workspace\www-dev\private\blog\modules\compte.php on line 97
----------

Erreur :
Citation:
( ! ) 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 :
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 :
Citation:
( ! ) 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 :
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 &#65533; 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
		));
	}
 
}
 
?>
g4llic4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 01h18   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 01h33   #5
Invité régulier
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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
g4llic4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 23h58   #6
Invité régulier
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
C'est bon
g4llic4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h02.


 
 
 
 
Partenaires

Hébergement Web