用字符串创建PHP类实例


223

我有两个课,class ClassOne { }class ClassTwo {}。我得到的字符串可以是"One""Two"

而不是使用长switch语句,例如:

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

有没有一种方法可以使用字符串创建实例,即new Class("Class" . $str);

Answers:


484

是的你可以!

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

使用名称空间时,请提供标准名称

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

您可以在php中执行的其他一些很酷的操作是:
变量变量

$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
谢谢你的例子!
乔尔

28
仅供参考,您不能部分使用变量。例如。$my_obj = Package\$class_name();。相反,您必须$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
Birla 2014年

14
请注意,在使用命名空间时,必须提供完整路径:$className = '\Foo\Bar\MyClass'; $instance = new $className();
Giel Berkers 2014年

5
没有汤匙...只有php。
Captain Hypertext

4
但是一个问题。上述方法可用于创建新的类实例。如果我想静态调用现有类的方法怎么办?我尝试如下:包含被调用类的字符串的变量$model = $user_model::find()->All(); 在哪里$user_model
Ramesh Pareek

22

您可以简单地使用以下语法来创建新类(如果您正在创建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.');
}

1
您是否会错过类名和扩展名之间的点?require_once($className.'php'); ->require_once($className.'.php');
J Quest


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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.