Call_user_method_array() et __construct

Signaler
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006
-
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006
-
Bonjour,



Je dois créer un objet en lui passant un nombre de parametre variable.
J'ai donc un tableau avec mes arguments et je pourrais utiliser
call_user_method_array mais le probleme etant que je veux passer mes
arguments a la fonction __construct de mon objet, celui netant pas
encore crée. Pour l'instant je ne vois pas comment faire pour
construire mon objet avec ette methode.



Merci d'avance.

Thomas.

9 réponses

Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,



dans ta fonction __construct() tu fais ça en gros (je sais pas si j'ai bien compris ta question)



public function __construct($tableau)

{



}



et lorsque tu appelles ta classe tu fais ça :



$classe = new classe($tableau);

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

En fait c'est comme ceci:



class maclasse

{

function __construct()

{

$params=func_get_args();

}

}



et apres je dois creer cet objet, mais le probleme c que le nombre d'arguments passé est variable(0,1,2...)

j'ai un tableau qui contient tous ces arguments $montableau



Je dois donc creer un objet en lui passant les arguments que contient $montableau



si je fais ca

$monobjet=new maclasse($montableau);

il va lui passer un tableau en argument donc ca ne minteresse pas.



Prenons un exemple ca sera plus simple :)



$montableau[0]="arg1";

$montableau[1]="arg2";

$montableau[2]="arg3";



Si je fais $monobjet=new monobjet($montableau)

ds le contructeur de maclasse j'aurais

$args[0]=$montableau



alors que moi je veux:

$args[0]="arg1"

$args[1]="arg2"

$args[2]="arg3"



Avec call_user_method_array() c'est possible mais le probleme c'est que
mon objet n'est pas crée mais je me suis rendu compte quon pouvait a la
place du nom de lobjet passer le nom de la class pour le créer, ce qui
donne



$monobjet=call_user_method("__construct",maclasse,$montableau);



Le souci maintenant est qu'il identifie pas "__construct" comme une methode statique.

"__construct() cannot be called statically in"

Et je veux pas utiliser la fonction "mclasse()" comme en PHP4.



Donc voila :)
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

"$args" cest "$params" en fait
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



func_get_arg() peut être utilisé
conjointement à func_num_args() et
func_get_args() pour permettre aux fonctions
utilisateurs d'accepter un nombre variable d'arguments
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

Bonjour,



Ce n'est pas récuperer les parametres qui est compliqué mais bien de
les transmettre lors de la creation d'un objet. Ma question reste
entière :)
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Je ne comprends pas ton probleme, alors, je pense. Et je ne comprends pas ton exemple non plus lol.



si j'ai ca :



class maclasse {



private $tabArgs;



public function __construct ($tableau) {

$this -> tabArgs = $tableau; // par exemple, ce
n'est sans doute pas necessaire de faire de ton tableau un argument a
part entiere

}

}

tu auras bien $tabArgs[0] = $tableau[0] (donc = arg1).



call_user_method () sert a appeler une methode indirectement, pas a instancier un objet :



<?php

class maclasse {



private $tabArgs;



public function __construct ($tableau = '') {

$this -> tabArgs = $tableau;
// par exemple, ce n'est sans doute pas necessaire de faire de ton
tableau un argument a part entiere

}



public function helloWorld ($choix) {

echo 'Hello ', $choix;

}



}





$obj = new maclasse ();

call_user_method ('helloWorld', $obj, 'World');



?>



Ensuite, note ceci :



<?php

class maclasse {



private $tabArgs;



public function __construct ($tableau = '') {

$this -> tabArgs = $tableau;
// par exemple, ce n'est sans doute pas necessaire de faire de ton
tableau un argument a part entiere

}



public function helloWorld ($choix) {

echo 'Hello', $choix;

}



}





$obj = new maclasse ();

//call_user_method ('helloWorld', $obj, 'World');

$tab = array ('helloWorld');



$obj -> $tab[0] ('World');

?>



Et enfin ceci :



<?php

class maclasse {



public function __construct ($tableau) {

$this -> $tableau[0] ('World');

}



public function helloWorld ($choix) {

echo 'Hello', $choix;

}



}



$tab = array ('helloWorld');

$obj = new maclasse ($tab);



?>



A noter que call_user_method () est deprecie => call_user_func () a la place.
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

Salut,



Oui en effet j'ai bien l'impression que je ne suis pas compris :)



Je vais expliquer le plus exhaustivement ma situation. J'ai une classe(gcls) qui gere toutes mes autres classes. Lorsque je veux creer un nouvel objet je ne fais pas :

$obj= new monobj();

mais:

$obj=$gcls->new_class(type, params);



de sorte que comme mes objets sont identifiés par un id unique je ne
peux pas creer deux fois un objet qui fait reference a un seul objet en
fin de compte.



Par exemple j'ai une classe "member" qui se creer de la facon suivante:

$member =new member(1);



Ou 1 est l'identifiant unique du membre en question. Il se trouve que
parfois dans une meme page je fais reference deux fois au membre 1 mais
avec deux objets differents:

$member1= new member(1):

$member2=new member(1):



Ce qui est stupide puisque je fais des requetes SQL en plus pour rien du tout, sans parler de la memoire utilisée pour rien.



Donc je passe par glcs qui possede un tableau contenant tous mes objets crées.

Il m'arrive donc d'avoir:

$member1 =$gcls->new_class("member","1");

$member2=$gcls->new_class("member","1");



Mais au lieu de creer 2 objets je n'en creer qu'un au premier appel et
le deuxieme n'est pas crée, il fait juste reference au premier.



Mais lors de la creation de l'objet dans gcls je dois passer mes arguments de new_class, a partir du 2e, a la fonction constructrice de l'objet.



Je peux passer un tableau comme argument et ainsi n'avoir qu'un seul
arguement pour chaque creation de classe mais ca ne minteresse pas.
Aussi j'utilise call_user_method_array() pour passer ces arguments. Jusque la c'est bon, sauf que la methode que je veux appeler est __construct(). Il se trouve qu'avec call_user_method_array() on peut creer un objet mais je ne sais pas comment appeler __construct() car il me dit que ce n'est pas une methode statique.



Ai je ete clair ?
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Mouais, lol

je ne suis toujours pas sur de comprendre pourquoi tu as absolument besoin de faire ca. Tu peux sans doute eviter de creer 2 fois le meme objet (identique je veux dire), il y a plein de fonctions (et operateurs) pour ca en php.

Tu ne pourras pas appeler le constructeur comme ca : le constructeur ne peut pas etre declare statique (normal, ce n'est pas une methode "normale").

Mais comme je ne pige toujours pas pourquoi tu veux absoument appeler le constructeur de cette maniere, lol...je peux difficilement essayer de t'aider plus :-(
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

Le truc c'est que la j'ai une classe qui va tout gerer. Parceque j'ai
quand meme une 50aine de classe differentes et pas mal de processus qui
tournent en parallele. Alors si je m'amuse a chaque fois separement a
tester ca... Et la les includes des fichiers contenant mes classes ne
sont faits que lorsque la classe est reellement utilisee. De plus ce
mode de fonctionnement me permet de faire des logs puisque chaque
creation dobjet est repertorie. Et j'espere ensuite pouvoir faire
passer tous mes appels de fonctions de classe par cette classe. Mais
bon ca va attendre un peu, ca demande reflection :)



Je sens que je vais etre une oblige de creer une méthode particuliere
pour se "substituer" a __construct() mais ca mennuie fortement.



En tout cas merci.

Thomas.