使用字符串创建PHP类实例

时间:2011-01-02 12:21:42

标签: php

我有两个班级:

课程ClassOne { }和课程ClassTwo {}。我得到的字符串可以是“一个”或“两个”。 而不是使用长开关语句,如:

switch($str) {
   case "One":
       return new ClassOne();
   case "Two":
       return new ClassTwo();
}

无论如何,我可以使用字符串创建实例,即new Class("Class" . $str);

谢谢,

乔尔

4 个答案:

答案 0 :(得分:417)

是的,你可以!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

使用名称空间时,请提供fully qualified name

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

你可以在php中做的其他很酷的事情是:
Variable variables

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

可变功能&方法

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

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

答案 1 :(得分:20)

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

$className = $whatever;
$object = new $className;

作为(特别粗略的)示例工厂方法:

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

答案 2 :(得分:12)

查看http://www.php.net/manual/en/language.oop5.basic.php

中的示例3
$className = 'Foo';
$instance = new $className(); // Foo()

答案 3 :(得分:4)

让我们说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"

使用Reflection而不是仅仅使用原始字符串来创建对象,可以更好地控制对象并提高可测试性(PHPUnit在很大程度上依赖于Reflection)