PHP的ArrayAccess接口简介

最近在研究php微框架slim的源码,slim中的依赖注入基于pimple,于是又去学习了一下pimple。
对比之前自己写的依赖注入类,pimple有一个很新鲜的用法,不是采用

$container->session_storage = function ($c) {
    return new $c['session_storage_class']($c['cookie_name']);
};

而是以数组方式进行注入:

$container['session_storage'] = function ($c) {
    return new $c['session_storage_class']($c['cookie_name']);
};

看源码时才发现原来诀窍就在php5提供的ArrayAccess接口上。
php文档地址如下:http://www.php.net/manual/zh/class.arrayaccess.php
官方定义:提供像访问数组一样访问对象的能力的接口。
该接口主要定义了四个抽象方法:

abstract public boolean offsetExists ( mixed $offset ) #检查数据是否存在
abstract public mixed offsetGet ( mixed $offset )      #获取数据
abstract public void offsetSet ( mixed $offset , mixed $value )     #设置数据   
abstract public void offsetUnset ( mixed $offset ) #删除数据

下面以一个简单的例子来实际说明下该接口的使用:

<?php

class Container implements ArrayAccess
{
    private $s=array();

    public function offsetExists($key){
        echo "you're trying to check if something exist<br/>";
        return array_key_exists($key, $this->s);
    }

    public function offsetGet($key){
        echo "you're trying to get something<br/>";
        return isset($this->s[$key]) ? $this->s[$key] : '';
    }

    public function offsetSet($key, $value){
        echo "you're trying to set something<br/>";
        $this->s[$key] = $value;
    }

    public function offsetUnset($key){
        echo "you're trying to unset something<br/>";
        unset($this->s[$key]);
    }
}

$c = new Container();

$c['name'] = 'ben';                //调用了offsetSet
echo $c['name']."<br />";      //调用了offsetGet
echo empty($c['age'])."<br />";    //调用了offsetExists
unset($c['name']);             //调用了offsetUnset
echo empty($c['name']);

执行结果如下:

you're trying to set something
you're trying to get something
ben
you're trying to check if something exist
1
you're trying to unset something
you're trying to check if something exist
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值