菜单

php中依附注入长远领会,5中类等级的常量使用验证

2019年8月3日 - 4166am金沙下载

不久前php刚发布了5.5的第一个稳定版,介绍了一个类级别的常量,名字是
`CLASS` 这个常量对所有的类有效,返回类的全名。

不久前php刚发布了5.5的第一个稳定版,介绍了一个类级别的常量,名字是
`CLASS` 这个常量对所有的类有效,返回类的全名。

PHP程序员如何理解依赖注入容器(dependency injection container)

 代码如下

复制代码 代码如下:

背景知识

<?php
namespace vendorpackage;
class Foo
{
    // …
}
var_dump(Foo::CLASS);
//上面脚本输出 string(18) “vendorpackageFoo”.

<?php
namespace vendorpackage;
class Foo
{
    // …
}
var_dump(Foo::CLASS);
//上面脚本输出 string(18) “vendorpackageFoo”.

传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim类,接着做些其它工作。

为什么要使用它

为什么要使用它

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

我们为什么要使用一个这样的常量,当然不是像上面那个例子一样只是获得类的全名。我们使用__NAMESPACE__也可以达到同样的效果,而且php5.3就可以用了:

我们为什么要使用一个这样的常量,当然不是像上面那个例子一样只是获得类的全名。我们使用__NAMESPACE__也可以达到同样的效果,而且php5.3就可以用了:

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

 代码如下

复制代码 代码如下:

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

<?php
namespace vendorpackage;
class Foo
{
    // …
}
var_dump(__NAMESPACE__ . ‘Foo’);

<?php
namespace vendorpackage;
class Foo
{
    // …
}
var_dump(__NAMESPACE__ . ‘Foo’);

$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;

 代码如下

<?php
use vendorpackageFoo;
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testBarCanBeProcessed()
    {
        $bar = $this->getMock(‘vendorpackageBar’);
        $foo = new Foo;
        $foo->process($bar);
        // …
    }
}

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

<?php
use vendorpackageFoo;
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testBarCanBeProcessed()
    {
        $bar = $this->getMock(‘vendorpackageBar’);
        $foo = new Foo;
        $foo->process($bar);
        // …
    }
}

复制代码 代码如下:

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

 

<?php
use vendorpackageFoo;
use vendorpackageBar;
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testBarCanBeProcessed()
    {
        $bar = $this->getMock(Bar::CLASS);
        $foo = new Foo;
        $foo->process($bar);
        // …
    }

class Foo
{
    private $bar;

 代码如下

您可能感兴趣的文章:

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

<?php
use vendorpackageFoo;
use vendorpackageBar;
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testBarCanBeProcessed()
    {
        $bar = $this->getMock(Bar::CLASS);
        $foo = new Foo;
        $foo->process($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)
    {
        $this->s[$k] = $c;
    }

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

相关文章

发表评论

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

网站地图xml地图