2014-10-21 2 views
0

Я создал фабрику объектов, где я передаю имя объекта в качестве первого параметра, а затем массив зависимостей в качестве второго параметра. У меня уже есть работа, но я чувствую, что должна быть простая функция php, позволяющая динамическое создание объекта.Динамически создавать объекты с зависимостями в PHP

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

Цель этого завод для извлечения объекта Thats сериализована в сессии, если она существует, если нет, то создать новый экземпляр объекта, а затем сохранить в сессии. Я хочу знать, есть ли функция php для динамического создания нового объекта с зависимостями.

+0

Я не думаю, что есть более простой способ сделать это. То, что вы выглядите довольно элегантно для меня. –

+1

Я думаю, вы должны взглянуть на 'spl_autoload_register' [в руководстве PHP] (http://php.net/manual/en/function.spl-autoload-register.php) – RiggsFolly

+0

с использованием API класса Reflection для PHP, вероятно, помогите вам ввести зависимость от вашего конструктора классов. – Miks

ответ

-2

Просто используйте new ключевое слово:

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

или вы можете создать строку и использовать eval().

Edit

В ответ на озабоченность Джастина кианг, вот пример:

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] 
+0

Что вы предоставили, вероятно, то, что OP имеет в своем методе get(). Это довольно стандартный способ кодирования фабрики в этом конкретном шаблоне проектирования. –

+0

Кроме того, то, что у вас было, не заботится об инъекции зависимости, которую плакат имел на своем заводе. –

+0

@justinKiang Обратите внимание на функцию eval. он делает то, что хочет. с eval вы можете запустить динамически сгенерированную строку php-скрипта внутри php-скрипта. – Cunning

0

Насколько я понимаю, что ты «Заглядывая в будущее, это структура внедрения инъекций.

PHP не предлагает такую ​​вещь из коробки.

Есть, однако, хорошие внешние библиотеки, такие как PHP-DI, которые обеспечивают такую ​​функциональность. Поскольку вы уже создали такую ​​библиотеку самостоятельно, я не думаю, что вам это понадобится, но я думаю, что это все равно стоит упомянуть - вы можете посмотреть, как делаются некоторые вещи (например, как бороться с одиночными играми и т. Д. .).

Приятная вещь о PHP-DI заключается в том, что сами объекты определяют, что им нужно, а главная фабрика объектов заботится обо всем, создавая карту зависимостей (возможно, это то, что вы подразумеваете под «более простым» подходом - Фактически необходимо передать список зависимых объектов в PHP-DI).

Если бы я сделать такую ​​вещь себе, я бы реализовать ObjectFactory::define($key, array $deps), который будет вызываться один раз для каждого объекта, а затем использовать только ObjectFactory::get($key) всякий раз, когда мне нужно, не имея ничего знать о зависимостях $$key «s.

Смежные вопросы