在PHP中动态实例化具有依赖项的对象

时间:2014-10-21 16:13:21

标签: php class oop

我创建了一个对象工厂,我将对象名称作为第一个参数传递,然后将一个依赖项数组作为第二个参数传递。我已经有了它的工作,但我觉得必须有一个简单的PHP函数来允许对象的动态实例化。

$shinyObject = ObjectFactory::get('Model\MyObject', array('\lib\DependencyOne', '\lib\DependencyTwo'))

此工厂的目的是检索在会话中序列化的对象(如果存在),如果不存在,则创建对象的新实例,然后保存在会话中。我想知道是否有一个php函数来动态地使用依赖项实例化一个新对象。

2 个答案:

答案 0 :(得分:0)

据我所知,您正在关注的是依赖注入框架。

PHP不提供开箱即用的东西。

但是,有一些很好的外部库,例如PHP-DI,可以提供这种功能。既然你已经自己创建了这样的库,我认为你不会需要它,但我认为无论如何都值得一提 - 你可以看看有些事情是如何完成的(例如,如何处理单身人士等等) )。

关于PHP-DI的好处是对象本身指定了他们需要的东西,主要对象工厂通过构建依赖关系图来处理所有事情(也许这就是你所说的“更容易”的方法 - 你不要实际上需要在PHP-DI中传递依赖对象列表。

如果我自己做这件事,我会实现每个对象调用一次ObjectFactory::define($key, array $deps),然后在需要时只使用ObjectFactory::get($key),而不必了解{{{1} 1}}的依赖。

答案 1 :(得分:-2)

只需使用new关键字:

$foo = 'Bar'
$bar = new $foo;

或者您可以生成字符串并使用eval()

修改

回应Justin Kiang的担忧,这是一个例子:

class A
{
}

class Foo
{
    public $a;
    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

function create($class, array $dependencies)
{
    $str = "\$bar = new $class("; 
    foreach ($dependencies as $dependency)
    {
        $str .= "unserialize('" . serialize($dependency) . "'), ";
    }
    $str = trim($str);
    $str = trim($str, ",") . ");";
    eval($str);
    return $bar;
}

$a = new A;

var_dump(create('Foo', [$a]));

结果如下:

object(Foo)[2]
  public 'a' => 
    object(A)[3]