call_user_func et les constructeur

Wacker
Invité n'ayant pas de compte PHPfrance

02 mai 2007, 15:19

Bonjour,

J'aimerais savoir comme on peux appeller un constructeur comme on le fais pour une fonction avec call_user_func :

$constructeur = "nom_classe";

call_user_func($constructeur,$constructeur); ?

y a t'il une autre fonction qui le permette car malheureusement j'ai traversé les docs et les forums et j'ai rien trouvé ...

Merci d'avance.

Mammouth du PHP | 505 Messages

02 mai 2007, 16:01

J'ai un peu de mal a comprendre la finalité de la chose mais bon...
class fooBar {
	public static $count = 1;
	public function __construct() {
		echo "appel N°" . self::$count++ . '<br>';
	}
	
	public function test() {
		echo __METHOD__ . '<br>';
	}
}
$fooBar = new fooBar();
call_user_func(array($fooBar, '__construct'));
Resultat

Code : Tout sélectionner

appel 1 appel 2

Wacker
Invité n'ayant pas de compte PHPfrance

02 mai 2007, 16:07

Bonjour,

En effet comme ca c'est inutile :wink: ,
en revanche je veux pouvoir construire un constructeur :

faire un equivalent de new nom_constructeur();

soit $objconstructeur = new nom_constructeur();

mais avec call_user_func ( ou une autre fonction )

car je ne recupere le nom de la class ( ou du contructeur puisque c'est le meme ) que par nom soit "nom_classe"

c'est pour ca que j'aurais besoin de faire un truc qui ressemble à :

$nomclass = "Ma_classe";
$objClass = call_user_func($nomclass);

Mammouth du PHP | 505 Messages

02 mai 2007, 16:36

Ok.
1er remarque, le nom de la class et le nom du constructeur ne sont pas les memes sauf si tu acceptes d'utiliser des syntaxes 'deprecated' présentent pour des raisons de compatibilité avec php4.
Puisque tu es dans le forum php5, je te suggère d'utiliser le constructeur __construct.

Quand a ce que tu veux faire, peut etre qu'un simple param au constructeur
te permettrai d'apeller le vrai constructeur de ton choix

class fooBar {
	public static $count = 1;
	public function __construct($foo) {
		echo "appel N°" . self::$count++ . '<br>';
		$this->$foo();
	}
	
	public function test() {
		echo __METHOD__ . '<br>';
	}
}
$fooBar = new fooBar('test');

Wacker
Invité n'ayant pas de compte PHPfrance

02 mai 2007, 17:25

Bonjour,

Pour la remarque je suis d'accord en effet.

En revanche je ne suis pas sur d'avoir bien compris le reste puis que dans ton exemple tu appel directement le constructeur par ca fonction moi j'ai juste le nom de la class.

merci.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

02 mai 2007, 18:08

Je n'ai pas tout compris, mais je crois que tu cherches à créer un objet à partir d'un nom de classe variable ? Dans ce cas tu peux utiliser la variable directement, par exemple :
$var = 'nom_classe';
$obj = new $var;
// $obj est de type "nom_classe"

Mammouth du PHP | 505 Messages

02 mai 2007, 19:17

J'ai du mal a te suivre aussi.

Si tu as le nom de la class, le constructeur s'appel toujours __construct.

Si tu veux a la base pouvoir choisir le constructeur a utiliser, tu dois bien avoir le nom du constructeur. Meme si tu pars du principe que le nom de la classe est aussi le nom du constructeur, tu peux modifier légèrement ca et dire que la class est unique et que ce que tu nommais nom de class devient le nom de la fonction à passer au constructeur.


Bref,
nomConstructeur = 'nom_class' ; // Pour reprendre ton exemple d'origine

et apres,

$instance = new TaClassAToi($nomConstructeur);

Et dans __construct(), tu fais l'aiguillage que j'ai indiqué dans le poste précédent. Le seul truc, c'est que tu instancie toujours la class TaClassAToi, seul le param passé au constructeur change.

Wacker
Invité n'ayant pas de compte PHPfrance

02 mai 2007, 19:19

Bonjour,

merci beaucoup en effet cela fonctionne je voyais compliqué alors que cela étais si simple.

merci @+

Mammouth du PHP | 505 Messages

02 mai 2007, 20:51

Bien, dans ce cas, tu peux cliquer sur le bouton Résolu :)