簡體   English   中英

動態實例化具有PHP依賴關系的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM