Eu tenho duas aulas class ClassOne { }
e class ClassTwo {}
. Estou recebendo uma string que pode ser um "One"
ou outro "Two"
.
Em vez de usar uma switch
declaração longa , como:
switch ($str) {
case "One":
return new ClassOne();
case "Two":
return new ClassTwo();
}
Existe uma maneira de criar uma instância usando uma string, ou seja new Class("Class" . $str);
?
$my_obj = Package\$class_name();
. Em vez disso, você deve$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
$className = '\Foo\Bar\MyClass';
$instance = new $className();
$model = $user_model::find()->All();
onde$user_model
é a variável que contém a string da classe que está sendo chamadoVocê pode simplesmente usar a seguinte sintaxe para criar uma nova classe (isso é útil se você estiver criando uma fábrica ):
Como um exemplo de método de fábrica (excepcionalmente bruto):
fonte
require_once($className.'php');
->require_once($className.'.php');
veja o exemplo 3 em http://www.php.net/manual/en/language.oop5.basic.php
fonte
Vamos dizer que
ClassOne
é definido como:Usando PHP Reflection;
Crie uma nova instância:
Chame um método:
Use uma variável como método:
Usar o Reflection em vez de apenas usar a string não processada para criar um objeto oferece um controle melhor sobre o objeto e uma testabilidade mais fácil (o PHPUnit depende muito do Reflection)
fonte