2010-07-31 9 views
1

comment obtenir un nom de fonction de constructeur de classe sans instancier la classe?Obtenir le constructeur de classe

exemple:

$class = 'someClass'; 
$constructor = somehow get constructor; 

$args = array(); 
$object = call_user_func_array(array($class,$constructor),$args); 

est ce que je dois créer un objet en passant un nombre indéterminé de variables dans son constructeur.

Répondre

6

Vous pouvez le faire avec Reflection:

<?php 

class Pants 
{ 
    public function __construct($a, $b, $c) 
    { 
     $this->a = $a; 
     $this->b = $b; 
     $this->c = $c; 
    } 
} 

$className = 'pants'; 
$class = new ReflectionClass($className); 
$obj = $class->newInstanceArgs(array(1, 2, 3)); 
var_dump($obj); 

Cela fonctionne aussi si votre constructeur utilise le style ancien (à moins que votre code utilise des espaces de noms et que vous utilisez PHP 5.3.3 ou, probablement, une plus grande , comme les constructeurs de style ancien ne fonctionne plus avec le code des espaces de noms - more info):

<?php 
class Pants { 
    function Pants($a, $b, $c) { ... } 
} 

Si la classe n'a pas de constructeur et que vous souhaitez utiliser la réflexion, utilisez $class->newInstance() au lieu de $class->newInstanceArgs(...). Pour faire ceci dynamiquement, cela ressemblerait à ceci:

$object = null === $class->getConstructor() 
    ? $class->newInstance() 
    : $class->newInstanceArgs($args) 
; 
+0

que se passe-t-il si la classe en question n'a pas de constructeur ?? –

+1

trouvé la solution: $ object = null === $ class-> getConstructor()? $ class-> newInstance(): $ class-> newInstanceArgs (array (1, 2, 3)); –

+0

Désolé, j'étais absent et j'ai raté votre commentaire. Je vais l'ajouter à la réponse pour l'exhaustivité. – Shabbyrobe

0

Le nom de la fonction du constructeur dans PHP est toujours __construct, donc vous l'avez déjà sans rien faire.

+0

et si la classe avait un constructeur de son propre nom de classe? –

+0

@Yuri: que voulez-vous dire? Le nom du constructeur sera toujours '__construct', mais pour l'appeler vous faites' new ClassName(); '. – Krevan

+0

@NullUserException oh, je ne le savais pas. @Krevan Donc, je peux toujours sans exception le faire? call_user_func_array (array ($ class, '__ construct'), $ args); –

Questions connexes