[英]Dynamically instantiate objects with dependencies in PHP
我創建了一個對象工廠,在其中我將對象名稱作為第一個參數,然后將依賴項數組作為第二個參數。 我已經可以使用它,但是我覺得必須有一個簡單的php函數來允許對象的動態實例化。
$shinyObject = ObjectFactory::get('Model\MyObject', array('\lib\DependencyOne', '\lib\DependencyTwo'))
該工廠的目的是檢索在會話中序列化的對象(如果存在),如果不存在,則創建該對象的新實例,然后保存在會話中。 我想知道是否有一個php函數來以依賴關系動態實例化一個新對象。
據我了解,您正在尋找的是一個依賴項注入框架。
PHP並不提供開箱即用的功能。
但是,有不錯的外部庫(例如PHP-DI)提供了這種功能。 由於您已經自己創建了這樣的庫,因此我認為您不需要它,但是無論如何我都值得一提-您可以查看如何完成某些工作(例如,如何處理單例,等等)。 )。
PHP-DI的優點在於,對象本身可以指定所需的內容,而主對象工廠則通過構建依賴關系圖來處理所有事情(也許這就是“更輕松”的方法的意思-您實際上並不需要在PHP-DI中傳遞依賴對象的列表)。
如果我要自己做這樣的事情,我將實現ObjectFactory::define($key, array $deps)
,每個對象將調用一次,然后在需要時僅使用ObjectFactory::get($key)
,而無需必須了解有關$$key
依賴$$key
的任何信息。
只需使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.