php:动态实例化类

php:动态实例化类,php,Php,是否可以从一个字符串实例化一个类,而之前不声明另一个变量 通常都是写的 $className = 'myClass' $instance = new $className(); 但它可能是方便的,让它更短,例如 $instance = new ${'className'}(); 其目的是在循环中创建(在条件下)对象,而不使用额外的变量 编辑:$className是动态的,上面对它进行了硬编码以解释这种情况这是一个额外的变量,它真的有很大的区别吗?答案是,除非您使用eval(这会带来安全问

是否可以从一个字符串实例化一个类,而之前不声明另一个变量

通常都是写的

$className = 'myClass'
$instance  = new $className();
但它可能是方便的,让它更短,例如

$instance  = new ${'className'}();
其目的是在循环中创建(在条件下)对象,而不使用额外的变量


编辑:$className是动态的,上面对它进行了硬编码以解释这种情况

这是一个额外的变量,它真的有很大的区别吗?答案是,除非您使用eval(这会带来安全问题),否则它不可能比第一个示例更短。

这是一个额外的变量,它真的有很大的不同吗?答案是,除非使用eval(这会带来安全问题),否则不可能比第一个示例更短。

您可以创建一个以类名为参数的工厂函数(或类/方法),然后使用生成字符串的动态PHP代码的结果调用它。您可能认为它有点干净,但它不会保存您的内存或速度。
class foo { }
function factory($class) { return new $class(); }

foreach (...) {
    $instance = factory(<some code that returns the string 'foo'>);
}
class foo{}
函数工厂($class){返回新的$class();}
foreach(…){
$instance=factory();
}

您可以创建一个以类名为参数的工厂函数(或类/方法),然后使用生成字符串的动态PHP代码的结果调用它。您可能认为它有点干净,但它不会保存您的内存或速度。
class foo { }
function factory($class) { return new $class(); }

foreach (...) {
    $instance = factory(<some code that returns the string 'foo'>);
}
class foo{}
函数工厂($class){返回新的$class();}
foreach(…){
$instance=factory();
}
请参阅

如果要设置某些类属性,我添加了可选参数数组

// 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()
必须
返回$this
(对象本身)以在一行中链接多个方法调用。

请参阅

如果要设置某些类属性,我添加了可选参数数组

// 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()
必须
返回$this
(对象本身)以在一行中链接多个方法调用。

PHP5.3有一些新语法,因此它可能在那里工作。另一个解决方案是使用
eval
。为什么会有“无额外变量”约束?另外,如果没有包含类名的变量,那么您只需编写
$instance=new classname()无论如何。如果你事先知道类名,你可以硬编码它;如果不这样做,它将已经在一个变量中。也许你可以把你的问题进一步扩展,以便更清楚地解释你的需要。我不明白。如果您没有使用一个变量使其成为动态的,并且硬编码
'className'
字符串,那么您为什么不直接执行
new className()
,首先使用一个简单的代码,避免内存过度使用,因为所有这些使用都已经是循环和繁重的mySQL事务,所以您应该在其他地方寻找优化,您不太可能从这些操作中看到任何好处,但是如果@Panagiotis所说的变量真的困扰您,您可以随时取消设置它。PHP5.3有一些新语法,因此它可能在那里工作。另一个解决方案是使用
eval
。为什么会有“无额外变量”约束?另外,如果没有包含类名的变量,那么您只需编写
$instance=new classname()无论如何。如果你事先知道类名,你可以硬编码它;如果不这样做,它将已经在一个变量中。也许你可以把你的问题进一步扩展,以便更清楚地解释你的需要。我不明白。如果您没有使用一个变量使其成为动态的,并且硬编码
'className'
字符串,那么您为什么不直接执行
new className()
,首先使用一个简单的代码,避免内存过度使用,因为所有这些都是循环和繁重的mySQL事务,所以你应该在其他地方寻找优化。你不太可能从这些操作中看到任何好处,但如果@Panagiotis所说的变量真的困扰你,你可以随时取消设置。除了内存使用,这似乎不是真正的问题,这个解决方案很有趣。。。我在不同的方法中使用这个动态实例化,所以这可能是一种集中化它并获得更好控制的方法。这个例子是错误的。factory应该是foo中的静态方法,并且是用foo实例化的新类。请看下面的例子……这肯定不是“错的”。虽然工厂通常是作为一个类来实现的(这正是我在回答中指出“或类/方法”的原因),但这样做绝对没有语法或道德要求。此外,您不知道要实例化什么类,因此,不能将工厂放入该类的定义中。也就是说,您必须创建一个新的泛型实用程序类,它只包含一个通用工厂方法。这和我的解决方案一样“错误”。除了内存使用似乎不是真正的问题,这个解决方案很有趣。。。我在不同的方法中使用这个动态实例化,所以这可能是一种集中化它并获得更好控制的方法。这个例子是错误的。factory应该是foo中的静态方法,并且是用foo实例化的新类。请看下面的例子……这肯定不是“错的”。虽然工厂通常是作为一个类来实现的(这正是我在回答中指出“或类/方法”的原因),但这样做绝对没有语法或道德要求。此外,您不知道要实例化什么类,因此,不能将工厂放入该类的定义中。也就是说,您必须创建一个新的泛型实用程序类,它只包含一个通用工厂方法。这和我的解决方案一样“错误”。