复制代码 代码如下: class Bar { public
function test() { $this->testPrivate(); $this->testPublic(); }
public function testPublic() { echo “Bar::testPublic\n”; } private
function testPrivate() { echo “Bar::testPrivate\n”; } } class Foo
extends Bar { public function testPublic() { echo “Foo::testPublic\n”;
} private function testPrivate() { echo “Foo::testPrivate\n”; } }
$myFoo = new foo; // Bar::testPrivate // Foo::testPublic
为何第风流倜傥行会输出Bar::testPrivate呢? 一些材质:
//www.jb51.net/article/31709.htm还也是有php官互连网,关于这段代码的贡献者回复中,也找到了一条:

PHP程序猿怎样了解重视注入容器(dependency injection container)

背景知识

金钱观的笔触是应用程序用到叁个Foo类,就能够创立Foo类并调用Foo类的法子,如果这几个法子内亟待四个Bar类,就能创立Bar类并调用Bar类的法子,而以此主意内须求多个Bim类,就能成立Bim类,接着做些别的职业。

<?php
// 代码【1】
class Bim
{
    public function doSomething()
    {
        echo __METHOD__, ‘|’;
    }
}

class Bar
{
    public function doSomething()
    {
        $bim = new Bim();
        $bim->doSomething();
        echo __METHOD__, ‘|’;
    }
}

class Foo
{
    public function doSomething()
    {
        $bar = new Bar();
        $bar->doSomething();
        echo __METHOD__;
    }
}

$foo = new Foo();
$foo->doSomething(); //
Bim::doSomething|Bar::doSomething|Foo::doSomething

接受信任注入的思绪是应用程序用到Foo类,Foo类需求Bar类,Bar类须要Bim类,那么先创立Bim类,再创造Bar类并把Bim注入,再次创下设Foo类,并把Bar类注入,再调用Foo方法,Foo调用Bar方法,接着做些其余职业。

<?php
// 代码【2】
class Bim
{
    public function doSomething()
    {
        echo __METHOD__, ‘|’;
    }
}

class Bar
{
    private $bim;

    public function __construct(Bim $bim)
    {
        $this->bim = $bim;
    }

    public function doSomething()
    {
        $this->bim->doSomething();
        echo __METHOD__, ‘|’;
    }
}

class Foo
{
    private $bar;

    public function __construct(Bar $bar)
    {
        $this->bar = $bar;
    }

    public function doSomething()
    {
        $this->bar->doSomething();
        echo __METHOD__;
    }
}

$foo = new Foo(new Bar(new Bim()));
$foo->doSomething(); //
Bim::doSomething|Bar::doSomething|Foo::doSomething

那正是决定反转格局。信赖关系的调节反转到调用链的起源。那样您能够完全调节正视关系,通过调解不一样的流入对象,来支配程序的表现。举例Foo类用到了memcache,能够在不改动Foo类代码的事态下,改用redis。

接受注重注入容器后的笔触是应用程序须要到Foo类,就从容器内获得Foo类,容器创制Bim类,再创立Bar类并把Bim注入,再创设Foo类,并把Bar注入,应用程序调用Foo方法,Foo调用Bar方法,接着做些别的专门的学业.

简单的讲容器负担实例化,注入信赖,管理信任关系等专门的职业。

代码演示 信赖注入容器 (dependency injection container)

由此三个最简易的器皿类来解释一下,这段代码来自 Twittee

<?php

class Container
{
    private $s = array();

    function __set($k, $c)
澳门新葡萄京app下载 ,    {
        $this->s[$k] = $c;
    }

    function __get($k)
    {
        return $this->s[$k]($this);
    }
}

这段代码应用了魔术点子,在给不可访谈属性赋值时,__set()
会被调用。读取不可访问属性的值时,__get() 会被调用。

<?php

$c = new Container();

$c->bim = function () {
    return new Bim();
};
$c->bar = function ($c) {
    return new Bar($c->bim);
};
$c->foo = function ($c) {
    return new Foo($c->bar);
};

// 从容器中拿到Foo
$foo = $c->foo;
$foo->doSomething(); //
Bim::doSomething|Bar::doSomething|Foo::doSomething

这段代码应用了无名函数

再来意气风发段轻易的代码演示一下,容器代码来自simple di container

<?php

class IoC
{
    protected static $registry = [];

    public static function bind($name, Callable $resolver)
    {
        static::$registry[$name] = $resolver;
    }

    public static function make($name)
    {
        if (isset(static::$registry[$name])) {
            $resolver = static::$registry[$name];
            return $resolver();
        }
        throw new Exception(‘Alias does not exist in the IoC
registry.’);
    }
}

IoC::bind(‘bim’, function () {
    return new Bim();
});
IoC::bind(‘bar’, function () {
    return new Bar(IoC::make(‘bim’));
});
IoC::bind(‘foo’, function () {
    return new Foo(IoC::make(‘bar’));
});

// 从容器中拿走Foo
$foo = IoC::make(‘foo’);
$foo->doSomething(); //
Bim::doSomething|Bar::doSomething|Foo::doSomething

发表评论

电子邮件地址不会被公开。 必填项已用*标注

CopyRight © 2015-2019 澳门新葡8455手机版 All Rights Reserved.
网站地图xml地图