使用字符串创建PHP类实例

使用字符串创建PHP类实例,php,Php,我有两个班,ClassOne{}和ClassTwo{}。我得到的字符串可以是“一”或“二” 不要使用长的开关语句,例如: switch ($str) { case "One": return new ClassOne(); case "Two": return new ClassTwo(); } 是否有一种方法可以使用字符串创建实例,即newclass(“Class”。$str)?是的,你可以 $str = 'One'; $class = 'Cl

我有两个班,
ClassOne{}
ClassTwo{}
。我得到的字符串可以是
“一”
“二”

不要使用长的
开关
语句,例如:

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}
是否有一种方法可以使用字符串创建实例,即
newclass(“Class”。$str)

是的,你可以

$str = 'One';
$class = 'Class'.$str;
$object = new $class();
使用名称空间时,请提供:

在php中可以做的其他很酷的事情有:
:

变量函数和方法

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

请看下面的示例3


您可以简单地使用以下语法来创建一个新类(如果您正在创建一个新类,这很方便):

作为(异常粗糙的)工厂方法示例:

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.');
}

假设
ClassOne
定义为:

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;
    }

}
使用PHP反射

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);
创建新实例:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);
调用一个方法:

$instance->echoArgOne();
//prints "Banana"
$method = "echoArgOne";
$instance->$method();

//prints "Banana"
使用变量作为方法:

$instance->echoArgOne();
//prints "Banana"
$method = "echoArgOne";
$instance->$method();

//prints "Banana"

使用反射而不是仅仅使用原始字符串来创建对象,可以更好地控制对象并简化可测试性(PHPUnit严重依赖反射)

FYI,您不能部分使用变量。例如,
$my_obj=Package\$class_name()。相反,您必须
$class\u name=“Package\\”$类别名称$my_obj=新的$class_name()请注意,使用名称空间时,必须提供完整路径:
$className='\Foo\Bar\MyClass'
$instance=new$className()没有勺子…只有php,只有一个问题。上述方法可用于创建新的类实例。如果我想静态调用现有类的方法,该怎么办?我做了如下尝试:
$model=$user\u model::find()->All()
其中,
$user\u model
是包含被调用类的字符串的变量,因为我们处理字符串,所以避开反斜杠更安全:
$className='\\Foo\\Bar\\MyClass'…对吗?在类名和扩展名之间有一点没有遗漏吗?
require_once($className.php')->
需要一次($className..php')
$instance->echoArgOne();
//prints "Banana"
$method = "echoArgOne";
$instance->$method();

//prints "Banana"