Ich habe zwei Klassen class ClassOne { }
und class ClassTwo {}
. Ich bekomme eine Zeichenfolge, die entweder "One"
oder sein kann "Two"
.
Anstatt eine lange switch
Anweisung wie:
switch ($str) {
case "One":
return new ClassOne();
case "Two":
return new ClassTwo();
}
Gibt es eine Möglichkeit, eine Instanz mithilfe einer Zeichenfolge zu erstellen, z new Class("Class" . $str);
.
$my_obj = Package\$class_name();
. Stattdessen müssen Sie$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
$className = '\Foo\Bar\MyClass';
$instance = new $className();
$model = $user_model::find()->All();
Wo$user_model
ist die Variable, die den String der aufgerufenen Klasse enthältSie können einfach die folgende Syntax verwenden, um eine neue Klasse zu erstellen (dies ist praktisch, wenn Sie eine Factory erstellen ):
Als (außergewöhnlich grobe) Beispielfabrikmethode:
quelle
require_once($className.'php');
->require_once($className.'.php');
Schauen Sie sich Beispiel 3 von http://www.php.net/manual/en/language.oop5.basic.php an
quelle
Nehmen wir an, es
ClassOne
ist definiert als:Verwenden von PHP Reflection;
Erstellen Sie eine neue Instanz:
Rufen Sie eine Methode auf:
Verwenden Sie eine Variable als Methode:
Wenn Sie Reflection verwenden, anstatt nur die Rohzeichenfolge zum Erstellen eines Objekts zu verwenden, haben Sie eine bessere Kontrolle über Ihr Objekt und eine einfachere Testbarkeit (PHPUnit ist stark von Reflection abhängig).
quelle