PHP 实现 IOC set 注入

php中文网
发布: 2016-06-23 13:34:42
原创
1180人浏览过

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

require 'DocParser.php';class Container {    /** * 利用容器来实例化对象,外部调用接口 *@param $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];    }    /** * 利用反射获取类需要的依赖条件,注释中包含@inject 注解的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的实现过程,没有考虑实际使用场景。

    ViiTor实时翻译
    ViiTor实时翻译

    AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

    ViiTor实时翻译 116
    查看详情 ViiTor实时翻译

    立即学习PHP免费学习笔记(深入)”;

    源码 下载地址

    PHP速学教程(入门到精通)
    PHP速学教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号