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 04/06/2008, 13h12   #1
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Par défaut [POO] Appeler une fonction par son nom dans une variable

Hello,

J'ai une fonction définie par exemple

Code :
1
2
3
public function getTabID()
{
}
Ce que je souhaiterai serait d'avoir un tableau de fonction :
Code :
$tabfct = array(0=>'getTabId')
Par la suite je voudrais appeler ma fonction par :
Code :
1
2
$fonction = $tabfct[0];
$fonction();
Comment faire pour avoir un truc similaire ? (si c'est possible)

Merci de votre aide.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 13h19   #2
Membre confirmé
 
Avatar de Gaara-Manga
 
Inscription : avril 2007
Messages : 247
Détails du profil
Informations personnelles :
Localisation : France, Vienne (Poitou Charente)

Informations forums :
Inscription : avril 2007
Messages : 247
Points : 213
Points : 213
A ma connaissance cela n'est pas possible.

Quand tu appelles ton tableau tu appelles des chaines ou des entiers ou des booléens,etc... mais tu n'appelles pas de fonction.
Gaara-Manga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 14h15   #3
Membre éclairé
 
Inscription : mai 2008
Messages : 359
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 359
Points : 397
Points : 397
Bonjour,

Un truc comme ça ?
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
 
<?php  
 
function classic()
{
	return 'The style is classic ';
	}
 
function baroque()
{
    return 'The style is baroque ';
	}
 
function romantic()
{
   return 'The style is romantic ';
   }
 
$styles = array('classic','baroque','romantic');
 
foreach($styles as $style)
{
   $stylefunction = $style;
   echo $stylefunction().'<br />';
   }
?>
Tsilefy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 14h28   #4
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Merci infiniment !!!! Là tu me sauve la vie, je ne trouvais pas les mots clés appropriés sur google : tu tappes "tableau+fonction", c'est mort !!!

Merci encore, j'ajoute ce post dans mes favoris!!!

Je cloture ce post mais j'ai une question hors sujet : que signifie cette écriture :
Je rencontre souvent ce code mais je vois pas ce que ça signifie.

Au cas ou qq repasse par ici, en attendant merci.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 14h29   #5
Membre confirmé
 
Avatar de Gaara-Manga
 
Inscription : avril 2007
Messages : 247
Détails du profil
Informations personnelles :
Localisation : France, Vienne (Poitou Charente)

Informations forums :
Inscription : avril 2007
Messages : 247
Points : 213
Points : 213
A jcroyais pas sa possible jcrois que sa pourrais bien mservir également^^

Merci Tsilefy
Gaara-Manga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 14h33   #6
Membre éclairé
 
Avatar de sacricri
 
Jean-Philippe Morvan
Inscription : juin 2008
Messages : 324
Détails du profil
Informations personnelles :
Nom : Jean-Philippe Morvan
Âge : 27

Informations forums :
Inscription : juin 2008
Messages : 324
Points : 349
Points : 349
Citation:
Envoyé par whitespirit Voir le message
Je rencontre souvent ce code mais je vois pas ce que ça signifie.


C'est de l'objet en fait

Tu crées une classe dans laquelle tu peux ajouter plusieurs fonctions et/ou variables fonctions de fonctions et du coup, pour les utiliser, on fait d'abord un '$maClass = new maClass()'

et ensuite on peut récupérer tout ce qui est à l'intérieur :
'$maClass->$variable' va récupérer la variable '$variable' située dans la classe 'maClass'
de même, si tu as une fonction 'mafonction' située dans 'maClass', tu l'appelles comme ceci :
$maClass->mafonction();
sacricri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 07h33   #7
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Oui mais si je fais
je récupère la variable définit comme
Code :
class maClass{ private $mavariable;}
Et si je fais , étant donné que j'ai le $ devant mavariable, je récupère quoi ?

C'est le fait d'avoir 2 $ qui me gènes...
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 09h09   #8
Membre éprouvé
 
Avatar de SphynXz
 
Développeur Web
Inscription : mars 2008
Messages : 439
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2008
Messages : 439
Points : 474
Points : 474
si tu as une variable qui est initialisé dans ta classe. tu dois l'appeler par l'opérateur directionnel '->', sans le $ sur la variable.

comme ceci donc :

$maclasse->mavariable

en objet on appelle plus communément une fonction, une méthode. et une variable une propriété

PS : dans ton exemple, ta propriété mavariable est privé. tu peux te brosser pour la récupérer , cela dit c'est correct. il te faut donc avoir une méthode qu'on apellerais getMavariable() { echo $this->mavariable }
__________________
I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
Pour détourner un avion, il faut monter dedans - Frédéric beigbeder
SphynXz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 09h48   #9
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Citation:
$maclasse->$mavariable
En effet, à ma connaissance, quand je fais une erreur de frappe en ajoutant le '$' mal placé avant le nom du membre (ou propriété) de la classe, php me retourne un code d'erreur.
Citation:
PHP Fatal error: Cannot access empty property
Donc la bonne façon pour accéder à un membre est:
Code :
1
2
3
4
5
6
7
8
Class mon_Obj{
  var   $mavariable;
}
 
$maclasse = new mon_Obj();
 
$maclasse->mavariable = 30;
echo $maclasse->mavariable;
Regarde un tuto sur POO (programmation Orientée Objet) avec php (Ya peut être mieux, mais s'est assez concentré.
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2008, 10h07   #10
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Merci de vos explications. En fait je connais la POO, mais je suis tombé sur ce type code qui fonctionnait. Mais vous avez raison, c'est relatif au php, je vais relire tout ça.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 15h55   #11
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Voilà j'ai la réponse
Code :
1
2
3
4
5
6
7
8
9
function Cumul($tab, $src, $dest){
	
	foreach($tab as $key => $value){
			
		echo $key."=>".$value->$src."<br>";
			
		$this->tab_H_Taux[$dest] += $value->$src;
	}
}
Il y a peut être plus simple mais, ceci fonctionne.
Dans ce cas, $tab est un tableau d'objet la boucle te permet de récupérer $value qui est l'index de l'objet et dans ce cas la variable $src que je passe en paramètre est le nom de la propriété dont je veux récupérer la valeur.

En un mots, $value->$src te retourne la valeur de la propriéte $src de l'objet $value dans la mesure ou $src="le_Nom_Propriete" est un membre connu de l'objet.

Je ne sais pas si je suis claire ?
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2008, 07h17   #12
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
merci,

En fait c'est ce que j'avais besoin. J'ai un tableau qui empilent des fonctions représentant une clause WHERE à une position. Du coup, je peux "facilement" faire
Code :
1
2
			$nameFonction = $this->_FILTER->GetFilterElementName($position);			
			return $this->$nameFonction();
Et ça marche !!! C'est cool !
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2008, 17h41   #13
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Je suis content d'avoir pu t'aider, mais à mon tour j'ai une question pour ma culture personnelle. Pourrais tu m'expliquer ce que tu fais sur cette ligne de code?
Citation:
$this->_FILTER->GetFilterElementName($position)
En particulier le double déréférencement, et aussi à quoi correspond le _FILTER avec un seul 'underscore'?

Merci
A+
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2008, 09h46   #14
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Ha, en fait, pour bien comprendre, faut voir le but de mes classes.

Si tu veux dans mes IHM j'ai la possibilité de faire un filtre sur une table MySQL (exemple, afficher les factures impayés). J'ai une classe abstraite de gestion des tables qui implémentent les filtres afin que les classes qui en héritent implémentent juste une fonction du type
Code :
public function FILTER_FactureImpaye(){return "IS_PAYE=0";]
qui correspond à une clause WHERE. Par exemple la requete final sera "SELECT * FROM Facture WHERE IS_PAYE=0;".

Du coup je vais avoir X fonctions dans chaque classe que je stockerai dans un tableau _FILTER (il s'agit donc en gros, d'un tableau de fonctions) qui sont rangés à une position : [1]["FILTER_FactureImpaye"]. FILTER est en fait une classe qui réalise d'autres opérations mais en gros je m'en sert pour stocker d'une façon propre mes fonctions.

Ce double référencement me permet de :

-Récupérer le nom de la fonction à une position donné (c'est la classe abstraite qui contient ce code) $nameFonction

- Exécuter la fonction par son nom return $this->$nameFonction();, et par exemple je viens de récupéré "IS_PAYE=0", ce qui reviens à écrire $this->FILTER_FactureImpaye().

Dans mon cas, l'avantage est que la fonction est définie dans la classe fille et l'appel de cette fonction se fait dans la classe mère qui, ne connait pas la dite fonction. Etant donné que à chaque table MySQL est associé une classe fille, c'est vraiment pratique.

Pour le underscore devant _FILTRE. C'est une norme que j'essaie de tenir : devant mes attributs privés et protégés je mets un underscore. Autrement dit, ça ne sert à rien, si ce n'est que si j'ai un code assez gros, je vois tout de suite quelles variables sont internes. Ha non, ça me sert aussi à autre chose de plus cool : mon éditeur gère l'autocomplétation et si je mets un '_' il m'affiche directement mes variables .

A bientôt

PS: C'est un peu dûr à expliquer
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2008, 11h00   #15
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Merci beaucoup pour ton explication.
Même si je suis complètement inculte en Classes abstraite (je ne les ai jamais utilisées). Grace à ton explication je vais peut être essayer d'y jeter un oeil.

Tu travail sur une application de gestion/facturation si j'ai bien compris. Est ce un produit commercial ou à usage interne?
A+
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2008, 06h38   #16
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
En fait, je dois développer un espèce de CRM qui répond à des besoins d'un métier précis (gestion de location).

Si tu comprends l'utilité de l'héritage alors t'as compris l'intérêt des classes abstraites. Puis tu extrapoleras et tu comprendras l'utilité des interfaces.

A bientôt
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2008, 11h23   #17
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
S'est amusant, je travail en relation très proche avec les syndics. J'ai mis en place un logiciel pour le suivit de la gestion technique du bâtiment au sein de notre entreprise.
Nos activités sont convergentes finalement.
Je bosse beaucoup avec du NFC/GPRS/Web/BDD.

Si tu en as le temps et l'envie, nous pourrions peut être présenter nos produits mutuels, il y a peut une convergence possible ?

A+
riete 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 01h40.


 
 
 
 
Partenaires

Hébergement Web