是否可以从字符串实例化一个类,而无需在之前声明另一个变量?
一般都是写完
$className = 'myClass'
$instance = new $className();
但它可能会很方便,例如
$instance = new ${'className'}();
目的是在不使用额外变量的情况下在循环内(在条件下)创建对象......
编辑: $className 是动态的,上面是硬编码来解释情况的
是否可以从字符串实例化一个类,而无需在之前声明另一个变量?
一般都是写完
$className = 'myClass'
$instance = new $className();
但它可能会很方便,例如
$instance = new ${'className'}();
目的是在不使用额外变量的情况下在循环内(在条件下)创建对象......
编辑: $className 是动态的,上面是硬编码来解释情况的
请参阅工厂模式。
class Foo {
static function factory($class, array $args = null) {
return new $class($args);
}
}
// class factoring; returns a new instance of requested class ($className)
Foo::factory($className);
如果你想设置一些类属性,我添加了可选参数数组。
// pass some values for class constructor
Foo::factory($className, array('arg1' => 1, 'arg2' => 2, 'args3' => 3));
此外,您可以构建“流体”接口,以便在使用该模式时可以“链接”方法:
Foo::factory($className)->method1()->method2(array('param' => 'value'))->etc();
其中method1()
,method2()
必须return $this
(对象本身)在一行中链接多个方法调用。
这是一个额外的变量,它真的有很大的不同吗?答案是除非你使用 eval (它带有安全问题),否则不可能比你的第一个例子更短。
您可以创建一个将类名作为参数的工厂函数(或类/方法),然后使用生成字符串的动态 PHP 代码的结果调用它。您可能会认为它更清洁,但它不会为您节省任何内存或速度。
class foo { }
function factory($class) { return new $class(); }
foreach (...) {
$instance = factory(<some code that returns the string 'foo'>);
}