web-dev-qa-db-fra.com

instancier une classe à partir d'une variable en PHP?

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 ()?

131
Pim Jager

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.

190
Paul Dixon

Comment passer des paramètres de constructeur dynamiques aussi

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

PHP> = 5.6

À 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é.

59
flu

Si vous utilisez des espaces de noms

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;
58
csga5000
class Test {
    public function yo() {
        return 'yoes';
    }
}

$var = 'Test';

$obj = new $var();
echo $obj->yo(); //yoes
28
zalew