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
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.
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.');
}
regardez l'exemple 3 de http://www.php.net/manual/en/language.oop5.basic.php
$className = 'Foo';
$instance = new $className(); // Foo()
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)