PHP中ArrayAccess用法小结

概述

在学习 laravel 框架或者其他的框架的源码中,你会经常看到 ArrayAccess 的身影,那它到底有什么用处呢?其实实现这个类可以让我们以调用数组的方式来调用对象的属性,十分的方便,如果你不理解这个类的用法,那你就很难理解 laravel 框架中门面模式的实现。

详解

请看下面的这段代码,Foo 类实现了 ArrayAccess 接口中的四个方法,请仔细看看这些方法的内部实现代码,你可能会会问,这些代码有什么用?如果问,那就是没用,随便怎么写,按照自己的需求来,接口中这四个方法的内部实现其实和方法名字没有任何的关系,取决于你自己的调用。

class Foo implements ArrayAccess
{
    public function offsetExists( $offset ) {
        echo "这里是 offsetExists() 方法 你输入的参数是 {$offset}";
    }

    public function offsetGet( $offset ) {
        echo "这里是 offsetGet() 方法 你输入的参数是 $offset";
    }

    public function offsetSet( $offset, $value ) {
        echo "这里是 offsetSet() 方法 你输入的 {$offset}={$value}";
    }

    public function offsetUnset( $offset ) {
        echo "这里是 offsetUnset() 方法 你输入的参数是 {$offset}";
    }
}

好了,让我们调用一下看看吧。

我们使用 isset 这个函数去调用 $foo['how'] ,那么实际上是调用了 offsetExists 这个方法,也就是说 $foo['how'] 这种结构去调用哪个 ArrayAccess 的方法是取决于你如何调用 $foo['how'] ,而方法的内部实现由你自己决定。

$foo = new Foo();
$t = isset($foo['how']);// 输出: 这里是 offsetExists() 方法 你输入的参数是 how
var_dump($t);// 输出: boolean false

接着我们看看这种 $foo['how'] 结构还可以如何被调用,不如这次直接调用 $foo['how'] 试试吧,我们从输出的结果可以发现直接调用了 offsetGet 这个方法。

$foo = new Foo();
$foo['what'];// 输出: 这里是 offsetGet() 方法 你输入的参数是 what

继续看还能怎么调用到其他的方法,我们给这个结构赋值看看,果然赋值的操作当然是调用offsetSet方法了,同样的方法内部的实现代码任然还是你想写什么就写什么。

$foo = new Foo();
$foo['when'] = 'today';// 输出: 这里是 offsetSet() 方法 你输入的 when=today

最后一个了,看方法名字也知道是通过unset方法才能被调用了。

php
$foo = new Foo();
unset($foo['wow']);// 输出: 这里是 offsetUnset() 方法 你输入的参数是 wow

总结

好了,我们小结一下

如果你的类实现了 ArrayAccess 接口,那么这个对象可以使用 $foo[xxx] 这种结构,十分的方便。

$foo['xxx'] 对应调用 offsetGet 方法。

$foo['xxx'] = 'yyy' 对应调用 offsetSet 方法。

isset($foo['xxx']) 对应调用 offsetExists 方法。

unset($foo['xxx']) 对应调用 offsetUnset 方法。

最后需要强调,方法的实现代码,具体如何写,可以根据你自己的业务需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值