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();