У меня есть два класса, class ClassOne { }
и class ClassTwo {}
. Я получаю строку, которая может быть "One"
или "Two"
.
Вместо использования длинного switch
выражения, такого как:
switch ($str) {
case "One":
return new ClassOne();
case "Two":
return new ClassTwo();
}
Есть ли способ , что я могу создать экземпляр , используя строку, то есть new Class("Class" . $str);
?
$my_obj = Package\$class_name();
, Вместо этого вы должны$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
$className = '\Foo\Bar\MyClass';
$instance = new $className();
$model = $user_model::find()->All();
где$user_model
находится переменная, содержащая строку вызываемого классаВы можете просто использовать следующий синтаксис для создания нового класса (это удобно, если вы создаете фабрику ):
В качестве (исключительно грубого) примера фабричного метода:
источник
require_once($className.'php');
->require_once($className.'.php');
взгляните на пример 3 со страницы http://www.php.net/manual/en/language.oop5.basic.php
источник
Скажем
ClassOne
, определяется как:Использование PHP Reflection;
Создайте новый экземпляр:
Вызовите метод:
Используйте переменную в качестве метода:
Использование Reflection вместо простого использования необработанной строки для создания объекта дает вам лучший контроль над вашим объектом и упрощает тестируемость (PHPUnit сильно зависит от Reflection)
источник