php:即时实例化类

时间:2012-07-20 19:39:29

标签: php

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

通常写完

$className = 'myClass'
$instance  = new $className();

但是将它缩短可能比较简单,例如

$instance  = new ${'className'}();

目的是在循环内创建(在条件下)对象而不使用额外的变量...

编辑: $ className是动态的,上面用硬编码来解释情况

3 个答案:

答案 0 :(得分:2)

请参阅factory pattern

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);

如果你想设置一些类属性,我添加了可选的arguments数组。

// 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(对象本身)将多个方法调用链接在一行中。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以创建一个以类名作为参数的工厂函数(或类/方法),然后使用生成字符串的动态PHP代码的结果调用它。您可能会认为它更清洁,但它不会为您节省任何记忆或速度。

class foo { }
function factory($class) { return new $class(); }

foreach (...) {
    $instance = factory(<some code that returns the string 'foo'>);
}