资讯专栏INFORMATION COLUMN

PHP 依赖注入

zengdongbao / 1331人阅读

摘要:通常调用一个类里面的方法需要如何操作依赖注入模式用来减少程序间的耦合依赖注入共有三种模式方法注入着重说下方法注入并结合单例注册的服务数组访问接口测试邮件发送成功方式访问通过数组的方式访问也是通过该方式实现依赖

通常调用一个类里面的方法需要如何操作:

$class = new class();
$class->fun()

依赖注入模式用来减少程序间的耦合

依赖注入共有三种模式: setter 方法注入

着重说下setter方法注入并结合ArrayAccess

/**
 * Class Di
 * @property People
 */
class Di implements ArrayAccess
{
    /**
     * 单例
     * @var null
     */
    protected static $instance = null;

    /**
     * 注册的服务
     * @var array
     */
    protected $data = array();

    public function __construct()
    {
        echo "__construct". "
";
    }

    public function onConstruct(){
        echo "onConstruct". "
";
    }

    public static function one(){
        if (self::$instance == null) {
            self::$instance = new Di();
            self::$instance->onConstruct();
        }
        return self::$instance;
    }

    public function get($name, $default = NULL) {
        if (!empty($default)) {
            return $default;
        }

        return $this->data[$name];
    }

    public function set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name)
    {
        return $this->get($name);
    }

    public function __set($name, $value)
    {
        $this->set($name, $value);
    }


    /** ArrayAccess数组访问接口 **/

    public function offsetSet($offset, $value) {
        $this->set($offset, $value);
    }

    public function offsetGet($offset) {
        return $this->get($offset, NULL);
    }

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
    }

    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

}

class People {

    protected $name = "测试";
    public function getName(){
        return $this->name;
    }

}

class Email {

    public function sendEmail($email){
        return "邮件发送成功!";
    }

}

$di = Di::one();
/** @var get set 方式访问 people */
$di->people = new People();
$people = $di->people;
echo $di->people->getName();

/** 通过数组的方式访问 **/
$di["Email"] = new Email();
echo $di["Email"]->sendEmail("33@qq.com");
Phalapi也是通过该方式实现依赖注入 
依赖注入相当于一个注册中心,通过魔术方法__set __get进行赋值和取之操作,$di->email
implements ArrayAccess 可以实现通过数组的方式进行操作$di["Email"]
构造方法注入

通过__construct出入类

class a
{
    public function test() {
        echo "test";
    }
}

class c
{
    protected $s;
    public function __construct($a)
    {
        $this->s = $a;
    }

    public function test(){
        $this->s->test();
    }
}

$a = new a();
$c = new c($a);
$c->test();
接口注入
interface sql{

    public function connect();
    public function query();
}


class mysql implements sql {

    public function connect()
    {
        echo "连接mysql成功". "
";
    }

    public function query()
    {
        // TODO: Implement query() method.
    }
}

class sqlServe implements sql {

    public function connect()
    {
        echo "连接sqlServe成功". "
";
    }

    public function query()
    {
        // TODO: Implement query() method.
    }
}

class Demo{

    public $sql;

    public function __construct(sql $sql)
    {
        $this->sql = $sql;

    }
}

$mysql = new mysql();
$sqlServe = new sqlServe();

(new Demo($mysql))->sql->connect();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29713.html

相关文章

  • 【译文】PHP-DI和依赖注入的最佳实践

    摘要:在构造函数中注入依赖性在中作为服务的控制器这是痛苦的,当你有个以上的依赖项,你的构造函数是行样板代码在属性中注入依赖性这是我们建议的解决方案。 PHP-DI是用PHP编写的、强大的和实用的、框架无关的依赖注入容器。这是一个关于如何使用PHP-DI和依赖注入的最佳实践指南。 文章来源于PHP-DI,作者:Matthieu Napoli和贡献者。PHP-DI是用PHP编写的、强大的和实用的...

    ivydom 评论0 收藏0
  • PHP IOC/DI 容器 - 依赖自动注入/依赖单例注入/依赖契约注入/参数关联传值

    摘要:标量参数关联传值依赖是自动解析注入的,剩余的标量参数则可以通过关联传值,这样比较灵活,没必要把默认值的参数放在函数参数最尾部。 更新:github(给个小星星呀) -- 2018-4-11:优化服务绑定方法 ::bind 的类型检查模式 借助 PHP 反射机制实现的一套 依赖自动解析注入 的 IOC/DI 容器,可以作为 Web MVC 框架 的应用容器 1、依赖的自动注入:你只需要...

    Paul_King 评论0 收藏0
  • 聊一聊PHP依赖注入(DI) 和 控制反转(IoC)

    摘要:前言最近在使用框架,看了下他的源码,发现有很多地方也用到了依赖注入控制反转,觉得有必要和大家简单聊一聊什么是依赖注入以及怎么使用它。概念依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源码,发现有很多地方也用到了依赖注入(控制反转),觉得有必要和大家简单聊一聊什么是依赖注入以及怎么使用它。 简介 I...

    sixgo 评论0 收藏0
  • 浅析如何通过PHP类的反射来实现依赖注入

    摘要:也正式因为类的反射很多框架才能实现依赖注入自动解决类与类之间的依赖关系,这给我们平时的开发带来了很大的方便。为了更好地理解,我们通过一个例子来看类的反射,以及如何实现依赖注入。反射出方法的参数其返回值为对象构成的数组。 PHP具有完整的反射 API,提供了对类、接口、函数、方法和扩展进行逆向工程的能力。通过类的反射提供的能力我们能够知道类是如何被定义的,它有什么属性、什么方法、方法都有...

    WilsonLiu95 评论0 收藏0
  • 又一个强大的PHP5.3依赖注入容器

    摘要:现在我们就可以在构造函数或者任何其他通过服务容器注入依赖项的地方使用类型提示注入接口创建一个新的类实例,此处将注入的实例。自动解析构造函数所需的依赖的服务容器实现了接口。 简单的服务容器 一个简单的 php 5.3 依赖注入容器。 项目地址:https://github.com/godruoyi/easy-container Why 目前比较流行的 PHP 容器: Pimple La...

    sf190404 评论0 收藏0
  • PHP依赖注入(代码全篇)

    摘要:依赖注入传统的思路应用程序用到一个类就会创建类并调用类的方法。这样你可以完全控制依赖关系,通过调整不同的注入对象,来控制程序的行为。例如类用到了,可以在不修改类代码的情况下,改用。 依赖注入 传统的思路 应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法。 假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法。 而这个方法内需要一个Bim类,就会创建Bim...

    felix0913 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<