2009-07-18 2 views
0

Je suis en train de faire une classe à partir d'une variable membre comme ceci:syntaxe PHP: la construction d'une classe à partir d'une variable membre

<? 
class A{ 
    private $to_construct = 'B'; 
    function make_class(){ 
     // code to make class goes here 
    } 

} 

class B{ 
    function __construct(){ 
     echo 'class constructed'; 
    } 
} 

$myA = new A(); 
$myA->make_class(); 
?> 

J'ai essayé d'utiliser:

$myClass = new $this->to_construct(); 

et

$myClass = new {$this->to_construct}(); 

mais aucun n'a fonctionné. J'ai fini par avoir à faire:

$constructor = $this->to_construct; 
$myClass = new $constructor(); 

Il semble qu'il devrait y avoir un moyen de le faire sans enregistrer le nom de classe dans une variable locale. Est-ce que je manque quelque chose?

Répondre

3

Avez-vous essayé?

$myClass = new $this->to_construct; 
+0

Merci, je pensais que je devais mettre la parenthèse pour montrer qu'il était une fonction. Y at-il toujours un moyen de le faire sans avoir à stocker le nom de la classe locale si vous avez besoin de passer des paramètres au constructeur? – Craig

+0

Ce n'est pas une fonction, cependant. Je ne suis pas sûr de savoir comment vous feriez ce dont vous avez besoin en PHP, soit. – jkeys

2

Utilisez-vous PHP 4 ou quelque chose? Le 5.2.9 $myClass = new $this->to_construct(); fonctionne parfaitement.

En fin de compte, c'est ce que vous devez vivre avec PHP. La syntaxe PHP et la sémantique sont TRÈS incohérentes. Par exemple, un accès au tableau à la suite d'un appel est une erreur de syntaxe:

function foo() { 
    return array("foo","bar"); 
} 
echo $foo()[0]; 

Toute autre langue pourrait le faire, mais PHP ne peut pas. Parfois, vous avez simplement besoin de stocker des valeurs dans des variables locales.

La même chose est vraie pour func_get_args() dans les anciennes versions de PHP. Si vous voulez le passer à une fonction, vous devez d'abord le stocker dans une variable locale.

0

Si je lis bien entre les lignes, vous essayez de faire quelque chose comme ça. Droite?

class createObject{ 
    function __construct($class){ 
     $this->$class=new $class; 
    } 

} 

class B{ 
    function __construct(){ 
     echo 'class B constructed<br>'; 
    } 
    function sayHi(){ 
     echo 'Hi I am class: '.get_class(); 
    } 
} 

class C{ 
    function __construct(){ 
     echo 'class C constructed<br>'; 
    } 
    function sayHi(){ 
     echo 'Hi I am class: '.get_class(); 
    } 
} 
$wantedClass='B'; 
$finalObject = new createObject($wantedClass); 
$finalObject->$wantedClass->sayHi(); 

-
Dam

Questions connexes