欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP 实现 IOC set 流入

程序员文章站 2022-06-05 18:10:30
...
PHP 实现 IOC set 注入

本文采用类似java中annotation的形式实现set注入
首先DI容器代码

require 'DocParser.php';class Container{    /**     * 利用容器来实例化对象,外部调用接口     [email protected] $name 为类名 eg. 'User'     */    public function get($name)    {        static $cache = array();        if(isset($cache[$name]))        {            return $cache[$name];        }        require 'models/' . ucfirst($name) . '.php';        $reflection = new ReflectionClass($name);        $depends = $this->getDependency($reflection);        $cache[$name] = $this->createObject($reflection, $depends);        return $cache[$name];    }    /**     * 利用反射获取类需要的依赖条件,[email protected] 注解的public 变量     * @param $reflection ReflectionClass     */    public function getDependency($reflection)    {        $depends = array();        $props = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);        foreach ($props as $prop) {            $str = $prop->getDocComment();            $parser = new DocParser();            $anotations = $parser->parse($str);            if(isset($anotations['inject']))            {                $depends[$prop->getName()] = $anotations['inject'];            }        }        return $depends;    }    /**     * 实例化对象的方法     * @param $instance ReflectionClass     * @param $depends array( 'field' => 'Class' ),  field 为注入的变量名,class为注入的类     */    public function createObject($instance, $depends)    {        $instance = $instance->newInstanceArgs(array());        foreach ($depends as $key => $value)        {            $instance->{$key} = $this->get($value);        }        return $instance;    }}

其中 DocParser.php 为解析php注释的工具类。

  • 使用方法篇
    在同级目录下新建models文件夹,新建User.php
class User{    /**     * 使用inject注解来标明该变量需要注入,后面跟着需要注入的类名     * @inject Email     */    public $email;    public function sendEmail()    {        $this->email->sendEmail();    }}

新建Email.php

class Email{    public function sendEmail()    {        echo 'send email!';    }}

在根目录下新建index.php

require 'Container.php';$di = new Container();$user = $di->get('User');$user->sendEmail();

运行一下index.php就能看到结果了。
本文只是演示IOC的实现过程,没有考虑实际使用场景。

源码 下载地址

PHP 实现 IOC set 流入

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频