创建带有字符串的PHP类实例

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

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

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

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

239336 次浏览

是的,你可以!

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

当使用名称空间时,提供全限定名:

$class = '\Foo\Bar\MyClass';
$instance = new $class();
你可以在php中做的其他很酷的事情是 变量的变量: < / p >
$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.

看看例子3从http://www.php.net/manual/en/language.oop5.basic.php

$className = 'Foo';
$instance = new $className(); // Foo()

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

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

假设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"

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

// Way #1
$className = "App\MyClass";
$instance = new $className();


// Way #2
$className = "App\MyClass";
$class = new \ReflectionClass($className);


// Create a new Instance without arguments:
$instance = $class->newInstance();


// Create a new Instance with arguments (need a contructor):
$instance = $class->newInstanceArgs(["Banana", "Apple"]);