概述
在学习 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
方法。
最后需要强调,方法的实现代码,具体如何写,可以根据你自己的业务需求。