web-dev-qa-db-fra.com

Création d'une instance de classe PHP avec une chaîne

J'ai deux cours:

classe ClassOne { } et classe ClassTwo {}. Je reçois une chaîne qui peut être "Un" ou "Deux". Au lieu d'utiliser une longue instruction switch telle que:

switch($str) {
   case "One":
       return new ClassOne();
   case "Two":
       return new ClassTwo();
}

Y a-t-il un moyen de créer une instance à l'aide d'une chaîne, c'est-à-dire new Class("Class" . $str);

Merci,

Joël

195
Joel

Oui, vous pouvez!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

Lorsque vous utilisez des espaces de noms, indiquez nom complet :

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

Voici d'autres choses intéressantes que vous pouvez faire en php:
variables variables :

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

Et fonctions et méthodes variables.

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 
430
Bob Fanger

Vous pouvez simplement utiliser la syntaxe suivante pour créer une nouvelle classe (pratique si vous créez un factory ):

$className = $whatever;
$object = new $className;

En tant que méthode d'usine (exceptionnellement brute):

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}
20
John Parker

regardez l'exemple 3 de http://www.php.net/manual/en/language.oop5.basic.php

$className = 'Foo';
$instance = new $className(); // Foo()
12
Freddie

Disons que ClassOne est défini comme:

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

Utilisation de PHP Reflection;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

Créer une nouvelle instance:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

Appelez une méthode:

$instance->echoArgOne();
//prints "Banana"

Utilisez une variable comme méthode:

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

Utiliser Reflection au lieu d'utiliser simplement la chaîne brute pour créer un objet vous donne un meilleur contrôle de votre objet et une testabilité plus facile (PHPUnit s'appuie fortement sur Reflection)

4
Remade