Je sais que cette question semble plutôt vague, je vais donc la rendre plus claire avec un exemple:
$var = 'bar';
$bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()');
C'est ce que je veux faire. Comment le ferais-tu? Je pourrais bien sûr utiliser eval () comme ceci:
$var = 'bar';
eval('$bar = new '.$var.'Class(\'var for __construct()\');');
Mais je préférerais rester à l’écart d’eval (). Est-il possible de faire cela sans eval ()?
Placez le nom de la classe dans une variable en premier:
$classname=$var.'Class';
$bar=new $classname("xyz");
C’est souvent le genre de chose que vous verrez entourée d’un motif Factory.
Voir Espaces de nommage et fonctionnalités de langage dynamique pour plus de détails.
Si vous souhaitez transmettre des paramètres de constructeur dynamiques à la classe, vous pouvez utiliser ce code:
$reflectionClass = new ReflectionClass($className);
$module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);
Plus d'informations sur les classes et paramètres dynamiques
À partir de PHP 5.6), vous pouvez encore plus simplifier cela en utilisant Argument Unpacking :
// The "..." is part of the language and indicates an argument array to unpack.
$module = new $className(...$arrayOfConstructorParameters);
Merci à DisgruntledGoat pour l'avoir signalé.
Dans mes propres conclusions, je pense qu'il est bon de mentionner que vous (pour autant que je sache) doit déclarer le chemin d'accès complet à un espace de noms d'une classe.
MyClass.php
namespace com\company\lib;
class MyClass {
}
index.php
namespace com\company\lib;
//Works fine
$i = new MyClass();
$cname = 'MyClass';
//Errors
//$i = new $cname;
//Works fine
$cname = "com\\company\\lib\\".$cname;
$i = new $cname;
class Test {
public function yo() {
return 'yoes';
}
}
$var = 'Test';
$obj = new $var();
echo $obj->yo(); //yoes