iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >现代PHP框架里的IOC容器怎么实现
  • 715
分享到

现代PHP框架里的IOC容器怎么实现

2023-07-04 22:07:05 715人浏览 安东尼
摘要

这篇文章主要讲解了“现代PHP框架里的ioc容器怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“现代php框架里的ioC容器怎么实现”吧!容器是什么?相信很多人听说过依赖注入,依赖注入

这篇文章主要讲解了“现代PHP框架里的ioc容器怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“现代php框架里的ioC容器怎么实现”吧!

容器是什么?

相信很多人听说过依赖注入,依赖注入实现的基础条件离不开容器,容器就是用来管理类依赖和注入的,负责服务的管理和解耦组件,最简单的理解我们可以把容器理解成一个超级大、专门存对象的数组

现代PHP框架里的IOC容器怎么实现

如图所示调用者通过容器的标示获取到对象实例,图里可以看出来,可以通过 ::class 的方式来获取也可以直接通过对象标示获取实例对象。

IOC是什么?

大家可能都听说过IOC容器,IOC的全称是:(Inversion Of Control,反转控制)。

我们来理解一下什么是反转控制,在我们传统编码中我们在类与类之间的依赖通常是我们通过编码的方式new出来对象再传递的,而使用控制反转我们可以把对象的控制权交给容器或者框架去实现。目的是为了让我们不需要硬编码去创建对象,看图1可以知道,容器里面存放着很多对象,当我们要使用的时候可以直接去用。而容器里面的对象不需要我们在代码中编码创建。在需要某个类对象的时候会去容器里面获取对象,如果对象不存在则会自动创建。这就是省略了我们在代码里面去创建对象的过程,由容器去帮我们实现这个创建的过程,这就叫反转控制。一句话总结IOC:把创建对象的控制权转移给容器实现类的实例化。

例如:没有使用IOC的情况下,我们想要创建类

<?phpclass Sunny{}$sunny = new Sunny();

我们需要手动去new一个类,这种情况就是硬编码在代码里面去实现的。

而使用IOC容器的代码则可以这样写。

<?phpclass Sunny{}$sunny = Container::getBean(Sunny::class);

在容器的内部去帮我们实现这个类,有同学看到这里可能会有疑问,我使用 new Sunny 不是代码写得更短更简单吗?我们看完依赖注入再看一个例子。

依赖注入

现在知道了IOC是什么,那么一个新的问题出来了,我们在创建类的时候有些类的构造方法会需要我们传递参数怎么办?通过IOC的学习我们知道了IOC容器会帮我们解决这个对象实例创建的问题,那么在容器里面创建对象的时候发现类有其他依赖则会进行依赖查找,容器寻找需要对象的过程,称为DL(Dependency Lookup, 依赖查找)。而把需要的依赖注入到代码片段中这个称为DI(Dependency Injection,依赖注入)。

例如IOC里面说到的 new Sunny 这个例子。如果在类与类之间有多重依赖。

<?phpclass Computer{    public function run(){        echo "编程中....\n";    }}class Sunny{    private $computer;    public function __construct(Computer $computer){        $this->computer = $computer;    }    public function program(){        $this->computer->run();    }}$sunny = new Sunny(new Computer());$sunny->program();

这里可以看到 Sunny 这个类想要编程依赖类 Computer 这个类,而如果使用IOC容器实现依赖注入的话,代码就简单了。

<?phpclass Computer{    public function run(){        echo "编程中....\n";    }}class Sunny{    private $computer;    public function __construct(Computer $computer){        $this->computer = $computer;    }    public function program(){        $this->computer->run();    }}$sunny = Container::getBean(Sunny::class);$sunny->program();

一句话总结:解决创建类实例当中对其他类的依赖,动态的向某个对象提供它所需要的其他对象。

依赖倒置

依赖倒置解决的问题是松耦各个模块之间的重度依赖,上层模块不应该依赖底层模块,它们都应该依赖于抽象。通常简单的理解依赖倒置就是面向接口或者面向抽象来进行编程。我们通过下面的例子来看看面向接口编程。

class Cache{    public function set($key,$value){        $redis = new CFile();        $Redis->set($key,$value);    }}class CFile{    public function set($key,$value){        echo "file:{$key}->{$value}\n";    }}$cache = new Cache();$cache->set("name","sunny");

上面的这段代码看似没有什么大问题,但是如果有一天把文件缓存改成Redis缓存呢?

class Cache{    public function set($key,$value){        $redis = new CRedis();        $redis->set($key,$value);    }}class CRedis{    public function set($key,$value){        echo "redis:{$key}->{$value}\n";    }}$cache = new Cache();$cache->set("name","sunny");

通过这段代码可以看出来当一个缓存使用的驱动改变了的时候,Cache的代码也必须作出相应的改变,因为代码写死在调用者身上了,耦合度变得高了。再对代码进行改造一样,让程序员面向interface编程,让代码变得更通用,更规范。

interface ICache{    public function set($key,$value);}class CRedis implements ICache {    public function set($key,$value){        echo "redis:{$key}->{$value}\n";    }}class CFile implements ICache{    public function set($key,$value){        echo "file:{$key}->{$value}\n";    }}class Cache{    private $drive;    public function __construct(ICache $drive){        $this->drive = $drive;    }    public function set($key,$value){        $this->drive->set($key,$value);    }}$cache = new Cache(new CFile());$cache->set("name","sunny");

很多人看到这段代码的时候想着,那我在构造方法直接把要的对象传进去不就好了吗?为什么还要定义一个interface呢?其实定义interface是为了规范代码,不管你使用哪个驱动,只要实现了我这个interface的都可以用,没有interface开发者在开发驱动的时候就会不知道这个驱动里面该有什么方法。当我们使用interface之后大家只要面向接口编程,Cache完全不管类是怎么实现的,Cache只是根据interface的方法进行操作。

一句话总结:依赖倒置实现松耦合

实战:根据容器原理实现容器

<?phpclass Container{    // 当前容器对象    private static $instance;    // 存放在容器里面到实例    protected $instances = [];    private function __construct(){    }    public static function getInstance(){        if (!self::$instance) {            self::$instance = new static();        }        return self::$instance;    }        public function get($key){        if (isset($this->instances[$key])) {            return $this->instances[$key];        }    }        public function bind($key, $concrete = null){        if ($concrete instanceof Closure) {            $this->instances[$key] = $concrete;        } elseif (is_object($concrete)) {            $this->instances[$key] = $concrete;        }        return $this;    }}class Sunny{    public function getName(){        echo time() . "\n";    }}$app = Container::getInstance();$sunny = $app->bind(Sunny::class,new Sunny());$sunny = $app->get(Sunny::class);$sunny->getName();

实战:实现依赖注入

Container.php<?phpclass Container{    // 当前容器对象    private static $instance;    // 存放在容器里面到实例    protected $instances = [];    private function __construct(){    }    public static function getInstance(){        if (!self::$instance) {            self::$instance = new static();        }        return self::$instance;    }        public function get($key){        if (isset($this->instances[$key])) {            return $this->instances[$key];        }        return $this->make($key);    }        public function bind($key, $concrete = null){        if ($concrete instanceof Closure) {            $this->instances[$key] = $concrete;        } elseif (is_object($concrete)) {            $this->instances[$key] = $concrete;        } else {            $this->make($key, $concrete);        }        return $this;    }        public function make($abstract, $atgs = null){        if (isset($this->instances[$abstract])) {            return $this->instances[$abstract];        }        $object = $this->invokeClass($abstract);        $this->instances[$abstract] = $object;        return $object;    }        public function invokeClass($abstract){        $reflectionClass = new \ReflectionClass($abstract);        // 获取构造方法        $construct = $reflectionClass->getConstructor();        // 获取参数得到实例        $params = $construct ? $this->parserParams($construct) : [];        $object = $reflectionClass->newInstanceArgs($params);        return $object;    }        public function parserParams(ReflectionMethod $reflect){        $args = [];        $params = $reflect->getParameters();        if (!$params) {            return $args;        }        if (count($params) > 0) {            foreach ($params as $param) {                $class = $param->getClass();                if ($class) {                    $args[] = $this->make($class->getName());                    continue;                }                // 获取变量的名称                $name = $param->getName();                // 默认值                $def = null;                // 如果有默认值,从默认值获取类型                if ($param->isOptional()) {                    $def = $param->getDefaultValue();                }                $args[] = $_REQUEST[$name] ?? $def;            }        }        return $args;    }}Test.php<?phpclass Test{    public $name;    private $test1;    public function __construct(Test1 $test1){        $this->test1 = $test1;        $this->name = $this->test1->getName();    }}Test1.php<?phpclass Test1{    public function getName(){        return "test1返回的名字";    }}Sunny.php<?phprequire_once "./Container.php";require_once "./Test.php";require_once "./Test1.php";class Sunny{    private $test;    public function __construct(Test $test){        $this->test = $test;    }    public function getName(){        echo "获取test里面的name:{$this->test->name}\n";    }}$app = Container::getInstance();$sunny = $app->get(Sunny::class);$sunny->getName();

感谢各位的阅读,以上就是“现代PHP框架里的IOC容器怎么实现”的内容了,经过本文的学习后,相信大家对现代PHP框架里的IOC容器怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 现代PHP框架里的IOC容器怎么实现

本文链接: https://www.lsjlt.com/news/347643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 现代PHP框架里的IOC容器怎么实现
    这篇文章主要讲解了“现代PHP框架里的IOC容器怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“现代PHP框架里的IOC容器怎么实现”吧!容器是什么?相信很多人听说过依赖注入,依赖注入...
    99+
    2023-07-04
  • 一文理解和实现现代PHP框架里的IOC容器
    本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于IOC容器的相关内容,IOC的全称是:Inversion Of Control,反转控制,下面一起来看一下,希望对大家有帮助。容器是什么?相信很多人听说过依赖注入,依赖注入实现的基...
    99+
    2023-05-14
    php
  • Java中的IoC容器是怎么实现的
    本篇文章为大家展示了Java中的IoC容器是怎么实现的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。IoC的概念介绍控制反转(IOC)模式(又称DI:Dependency Injection)就是I...
    99+
    2023-05-31
    java ioc ava
  • PHP 重定向:如何在容器化的框架中实现?
    在现代的 Web 开发中,重定向是一个非常常见的功能,它允许我们将用户重定向到一个新的 URL,以便实现各种功能,比如登录、注册、购买等。在 PHP 中,重定向可以通过 header 函数来实现,但是在容器化的框架中,如何实现重定向呢?本...
    99+
    2023-09-17
    重定向 容器 框架
  • PHP容器技术能否实现Spring框架的实时数据处理?
    随着大数据时代的到来,实时数据处理成为了越来越多企业和开发者的需求,而Spring框架则是Java语言中最为流行的框架之一,它在实时数据处理方面有着得天独厚的优势。那么,PHP容器技术是否能够实现Spring框架的实时数据处理呢?本文将从...
    99+
    2023-09-12
    容器 实时 spring
  • spring IOC容器的Bean管理XML自动装配怎么实现
    这篇文章主要讲解了“spring IOC容器的Bean管理XML自动装配怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring IOC容器的Bean管理XML...
    99+
    2023-06-30
  • 容器化框架的重定向:使用 PHP 实现的最佳实践是什么?
    随着云计算的快速发展,容器化技术已经成为了云计算领域中的一项重要技术。而容器化技术中的重定向功能更是一个不可或缺的部分。在本文中,我们将讨论使用 PHP 实现容器化框架的重定向的最佳实践。 什么是容器化框架的重定向? 容器化框架的重定向是...
    99+
    2023-09-17
    重定向 容器 框架
  • PHP 重定向与容器框架:实现最佳实践的关键要素。
    PHP 重定向与容器框架:实现最佳实践的关键要素 在现代 Web 应用中,重定向是非常常见的一种操作,它可以将用户从一个 URL 地址重定向到另一个 URL 地址,以实现页面跳转、表单提交、登录验证等功能。而在 PHP 中,重定向的实现可以...
    99+
    2023-09-17
    重定向 容器 框架
  • golang tcp框架怎么实现
    要实现一个基于TCP的框架,可以参考以下步骤: 导入所需的包: net、io、bufio、sync等。 创建一个TCP服务器...
    99+
    2024-02-29
    golang
  • PHP框架和Linux环境:如何实现最佳兼容性?
    在今天的互联网时代,PHP已经成为了最流行的服务器端编程语言之一。而PHP框架的出现,更是让PHP的应用范围更加广泛。在使用PHP框架的同时,与之兼容的Linux环境也是至关重要的。本文将会探讨如何实现PHP框架和Linux环境的最佳兼容性...
    99+
    2023-11-11
    框架 linux linux
  • PHP容器技术的新进展:如何实现Spring框架的实时数据传输?
    随着互联网的快速发展,各种技术不断涌现。PHP作为一种流行的编程语言,一直以来在Web应用程序开发中扮演着重要的角色。而PHP容器技术则是近年来备受关注的技术之一,它可以轻松地将PHP应用程序打包成容器,实现快速部署和移植。本文将介绍PH...
    99+
    2023-09-12
    容器 实时 spring
  • 如何用PHP实现简易的MVC框架
    这篇文章主要介绍了如何用PHP实现简易的MVC框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用PHP实现简易的MVC框架文章都会有所收获,下面我们一起来看看吧。一、前言MVC的全名是Model View...
    99+
    2023-06-30
  • C#怎么实现AOP微型框架
    本篇内容介绍了“C#怎么实现AOP微型框架”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在向大家详细介绍C#实现AOP微型框架之前,首先让大...
    99+
    2023-06-17
  • python工作流框架怎么实现
    要实现一个Python工作流框架,可以按照以下步骤进行: 确定框架的目标和功能:确定工作流框架需要支持的功能,例如任务调度、任务...
    99+
    2023-10-26
    python
  • 使用Java反射模拟实现Spring的IoC容器的操作
    目录实现的功能:项目结构下面是程序的项目结构图:自定义注解容器实现测试实体类User的定义:实现的功能: 默认情况下将扫描整个项目的文件 可以使用@Componen...
    99+
    2024-04-02
  • 如何在 Linux 容器中实现高效的 ASP 框架部署?
    在当今互联网时代,应用程序的快速开发和部署变得越来越重要。而 Linux 容器技术的出现,使得应用程序的部署变得更加容易、高效和可靠。本文将介绍如何在 Linux 容器中实现高效的 ASP 框架部署。 一、什么是 ASP 框架? ASP(A...
    99+
    2023-08-25
    框架 linux 容器
  • 怎样实现简单的RPC框架
    怎样实现简单的RPC框架,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.定义上下文对象在RpcContext对象中增加一个map类型的参数对象,可以存放任意扩展的参数。2.R...
    99+
    2023-06-04
  • 怎么使用thinkphp框架实现弹框功能
    今天小编给大家分享一下怎么使用thinkphp框架实现弹框功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。弹框的实现原理在...
    99+
    2023-07-05
  • 向Spring IOC容器动态注册bean实现方式是什么
    本篇内容主要讲解“向Spring IOC容器动态注册bean实现方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“向Spring IOC容器动态注册bean实现方式是什...
    99+
    2023-07-02
  • java负载均衡框架怎么实现
    在Java中,可以使用以下几种方式来实现负载均衡框架:1. 随机算法:通过随机选择一个可用的服务器来实现负载均衡。这种方式简单且易于...
    99+
    2023-10-12
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作