Mam dwie klasy class ClassOne { }
i class ClassTwo {}
. Otrzymuję ciąg, który może być "One"
albo "Two"
.
Zamiast używać długiej switch
instrukcji, takiej jak:
switch ($str) {
case "One":
return new ClassOne();
case "Two":
return new ClassTwo();
}
Czy istnieje sposób na utworzenie instancji za pomocą ciągu znaków, tj. new Class("Class" . $str);
?
$my_obj = Package\$class_name();
. Zamiast tego musisz$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
$className = '\Foo\Bar\MyClass';
$instance = new $className();
$model = $user_model::find()->All();
gdzie$user_model
jest zmienna zawierająca ciąg klasy o nazwieMożesz po prostu użyć następującej składni, aby utworzyć nową klasę (jest to przydatne, jeśli tworzysz fabrykę ):
Jako (wyjątkowo surowa) przykładowa metoda fabryczna:
źródło
require_once($className.'php');
->require_once($className.'.php');
spójrz na przykład 3 z http://www.php.net/manual/en/language.oop5.basic.php
źródło
Powiedzmy, że
ClassOne
jest zdefiniowany jako:Korzystanie z PHP Reflection;
Utwórz nową instancję:
Wywołaj metodę:
Użyj zmiennej jako metody:
Użycie Reflection zamiast zwykłego ciągu do utworzenia obiektu daje lepszą kontrolę nad obiektem i łatwiejszą testowalność (PHPUnit w dużym stopniu opiera się na Reflection)
źródło