Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从父容器调用方法_Php_Design Patterns_Containers - Fatal编程技术网

Php 如何从父容器调用方法

Php 如何从父容器调用方法,php,design-patterns,containers,Php,Design Patterns,Containers,我有一个包含其他容器的容器,它可以包含其他容器等等。对象container1具有特殊方法foo(),我想从container3调用此方法。我该怎么做 我考虑过单例设计模式,但在我的程序中存在不止一个类MyClass1的对象。我考虑过委托设计模式,但是container2不必对MyClass1一无所知(没有必要这样做) 您可以使用某种依赖项注入模式 举个小例子: interface FooContainer { function foo(); } Class Injector {

我有一个包含其他容器的容器,它可以包含其他容器等等。对象
container1
具有特殊方法
foo()
,我想从
container3
调用此方法。我该怎么做

我考虑过单例设计模式,但在我的程序中存在不止一个类
MyClass1
的对象。我考虑过委托设计模式,但是
container2
不必对
MyClass1
一无所知(没有必要这样做)


您可以使用某种依赖项注入模式

举个小例子:

interface FooContainer 
{
   function foo();
}

Class Injector
{
    private diContainer;

    static function getInstance() 
    {
       <singleton>
    }

    function addDependency(FooContainer $class, $key)  
    {
       $this->diContainer[$key] = $class;
    }

    function getDependency($key) 
    {
       return $this->diContainer[$key];
    }
}

Class Container1 implements FooContainer
{
    function foo()
    {
        echo "Foo"
    }
}

Class Container3
{
    private fooClass;

    function setFoo()
    {
        $this->fooClass = Injector::getInstance()->getDependency("foo");
        return $this;
    }

    function foo()
    {
        $this->fooClass->foo();
    }
}

但是你怎么知道这个结构呢?为什么不能在container3中按父ID获取父项,并为该对象调用该函数?这与委托模式不同?您如何解决将
container3
添加到
container2
container2
container1
一无所知的问题。那么如何设置
fooClass
?container3知道container2吗?不知道。每个容器都有自己的工作要做,而对其他容器不感兴趣。只有
container3
必须能够通知
container1
其工作结果。使用实际的DI容器重新编写代码。这是最简单的注射方式,但仍然有效。这不是很好,但是依赖注入是一个相当复杂的主题,需要很多复杂的解决方案。
interface FooContainer 
{
   function foo();
}

Class Injector
{
    private diContainer;

    static function getInstance() 
    {
       <singleton>
    }

    function addDependency(FooContainer $class, $key)  
    {
       $this->diContainer[$key] = $class;
    }

    function getDependency($key) 
    {
       return $this->diContainer[$key];
    }
}

Class Container1 implements FooContainer
{
    function foo()
    {
        echo "Foo"
    }
}

Class Container3
{
    private fooClass;

    function setFoo()
    {
        $this->fooClass = Injector::getInstance()->getDependency("foo");
        return $this;
    }

    function foo()
    {
        $this->fooClass->foo();
    }
}
$container1 = new Container1();
/** do whatever you need */
Injector::getInstance()->addDependency($container1, "foo");    
$container3 = new Container3();    
$container3->setFoo()->foo();