资讯专栏INFORMATION COLUMN

Pimple相关的源码

MSchumi / 3097人阅读

摘要:已经有了非常好的的相关解析,建议先看下一个简单的依赖注入容器读源码笔记上读源码笔记下这里通过例子补充下核心方法的说明相关的类型服务类似单例工厂服务多个实例参数仅仅是保存一些变量保护参数匿名函数都会被认为服务,但是如果仅仅是想作为一个

已经有了非常好的Pimple的相关解析,建议先看下:
Pimple - 一个简单的 PHP 依赖注入容器
读 PHP - Pimple 源码笔记(上)
读 PHP - Pimple 源码笔记(下)

这里通过例子补充下核心方法的说明:
相关的类型:

服务(类似单例):

$container["session"] = function ($c) {
    return new Session($c["session_storage"]);
};

工厂服务(多个实例)

$container["session"] = $container->factory(function ($c) {
    return new Session($c["session_storage"]);
});

参数(仅仅是保存一些变量)

$container["cookie_name"] = "SESSION_ID";

保护参数(匿名函数都会被认为【1服务】,但是如果仅仅是想作为一个参数,则需要用此方法)

$container["random_func"] = $container->protect(function () {
    return rand();
});

set赋值相关源码:

    public function offsetSet($id, $value)
    {
         //如果是被冻结,则无法赋值
        if (isset($this->frozen[$id])) {
            throw new FrozenServiceException($id);
        }
        //存入values
        $this->values[$id] = $value;
        //存入keys
        $this->keys[$id] = true;
    }

用【1服务】来举例,调用offsetSet方法后:

    $this->values["session"] = function ($c) {
        return new Session($c["session_storage"]);
    };
    $this->keys["session"] = true;

使用时$session=$container["session"];,此时调用offsetGet方法:

    public function offsetGet($id)
    {
        //$this->keys["session"]存在
        if (!isset($this->keys[$id])) {
            throw new UnknownIdentifierException($id);
        }

        if (
            isset($this->raw[$id])//$this->raw["session"],第一次调用是没有的,所以为false,重复调用则为ture
            || !is_object($this->values[$id])//所有的匿名函数都是object,所以为false。对应的情况【3参数】时为true
            || isset($this->protected[$this->values[$id]])//未调用protected方法,所以为false,对应的情况【4保护参数】时为true
            || !method_exists($this->values[$id], "__invoke")//所有匿名函数存在__invoke方法,所以为false
        ) {
            //综上,如果是第一次调用,不会执行到这一步,如果是重复调用、参数、protected方法相关的,则会执行
            return $this->values[$id];
        }
        //判定是不是多个实例,对应【2工厂服务】,由于我们没有调用factories方法,所以这一步也不会执行
        if (isset($this->factories[$this->values[$id]])) {
            return $this->values[$id]($this);
        }
        
        //此时$raw就是function ($c) 这个匿名函数
        $raw = $this->values[$id];
        
        //重新赋值$this->values["session"],将$this传入,相当于function ($this),之所以把$this传递过来,是因为匿名函数中可能还包含其它的服务,
        //例如上方的$c["session_storage"],$this传入后相当于$container["session_storage"],此时会触发调用offsetGet此方法。
        $val = $this->values[$id] = $raw($this);
        
        //将原始的匿名函数存入$this->raw中,$this->raw["session"]此时有值,重复访问时在上方判定时直接返回,相当于单例模式
        $this->raw[$id] = $raw;
        
        //标记已冻结,已经get后则不允许offsetSet或者extend了
        $this->frozen[$id] = true;
        
        //返回$this->values["session"]
        return $val;
    }

Pimple实现起来比较简单,主要是通过匿名函数来实现,没有像yii2容器那样支持普通类的构造函数自动解析依赖注入关系等,但是对于仅仅是调用各个组件来说也足够用了。

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

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

相关文章

  • 读 PHP - Pimple 源码笔记(下)

    摘要:服务容器接口是的简写,由组织制定的规范,是开发的实践标准。实现的容器类源码很简单,主要是传入变量,然后设置这个两个方法。原创文章,欢迎转载。原文链接地址作者发表日期 接着上篇 还有一些内容没有写,上篇已经把关于 Pimple 最主要的代码分析了一下,这篇主要是关于 PSR-11 兼容性的分析。 PSR-11 服务容器接口 PSR PSR 是 PHP Standard Recommend...

    KunMinX 评论0 收藏0
  • 读 PHP - Pimple 源码笔记(上)

    摘要:也就是闲时为了写文章而写的一篇关于源码的阅读笔记。是标准库的缩写,一组旨在解决标准问题的接口和类的集合。提供了一套标准的数据结构,一组遍历对象的迭代器,一组接口,一组标准的异常,一系列用于处理文件的类,提供了一组函数,具体可以查看文档。 也就是闲时为了写文章而写的一篇关于 Pimple 源码的阅读笔记。Pimple 代码有两种编码方式,一种是以 PHP 编写的,另一种是以 C 扩展编写...

    cfanr 评论0 收藏0
  • Pimple - 一个简单 PHP 依赖注入容器

    摘要:服务通过匿名函数定义,返回一个对象的实例定义一些服务请注意,匿名函数可以访问当前容器实例,从而允许引用其他服务或参数。如果要为所有调用返回不同的实例,请使用方法包装你的匿名函数。 链接 官网 WebSite GitHub - Pimple 这是 Pimple 3.x 的文档。如果你正在使用 Pimple 1.x ,请查看 Pimple 1.x 文档。阅读 Pimple 1.x ...

    wemall 评论0 收藏0
  • Pimple Containter 容器使用实例代码

    摘要:安装代码加载并实例化参数存储单例存储非单例存储存储匿名函数获取匿名函数服务提供者文档官网文档 Pimple/Container 安装 composer require pimple/pimple: ^3.0 代码 加载并实例化 require __DIR__ . /vendor/autoload.php; $pc = new PimpleContainer(); 参数存储 $pc[ap...

    maochunguang 评论0 收藏0
  • PHP容器--Pimple运行流程浅析

    摘要:实际上,闭包和匿名函数是伪装成函数的对象。容器流程浅析是社区中比较流行的容器。服务提供者服务提供者是连接容器与具体功能实现类的桥梁。服务提供者需要实现接口所有服务提供者必须实现接口方法。但已经完成了服务提供者的注册工作。 需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的。 闭包是指:创建时封装周围状态的函数。即使闭包所处的环境不存在了,闭包中封装的状态依然存在。 理论上...

    RobinTang 评论0 收藏0

发表评论

0条评论

MSchumi

|高级讲师

TA的文章

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