我创建了一个对象工厂,我将对象名称作为第一个参数传递,然后将一个依赖项数组作为第二个参数传递。我已经有了它的工作,但我觉得必须有一个简单的PHP函数来允许对象的动态实例化。
$shinyObject = ObjectFactory::get('Model\MyObject', array('\lib\DependencyOne', '\lib\DependencyTwo'))
此工厂的目的是检索在会话中序列化的对象(如果存在),如果不存在,则创建对象的新实例,然后保存在会话中。我想知道是否有一个php函数来动态地使用依赖项实例化一个新对象。
答案 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]