使用字符串创建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"