php arrayaccess什么作用,PHP中的ArrayAccess用法詳解

在Laravel的源碼當中,作者多次使用到了PHP SPL中的ArrayAccess接口,那么這個ArrayAccess接口到底有什么作用呢?我會用一個簡單的例子跟大家說明。

請看下面的這段代碼,Foo類實現了ArrayAccess接口中的四個方法,請仔細看這些方法內部的實現代碼。看到了嗎?這些代碼是干什么用的,回答就是這些代碼沒有用,隨便你怎么寫,你想寫什么就寫什么。接口中這四個方法的內部的實現跟方法名字其實沒有任何關系。啊!這。。。實際的作用是取決於你的調用。

class Foo implementsArrayAccess

{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['xxxx'] 這種結構去調用哪個ArrayAccess的方法是取決於你是如何調用的 $foo['xxxx']。而方法內部的實現代碼你想怎么寫就怎么寫。在這里一旦你使用isset去調用了這種結構,系統就會去調用offsetExists這個方法,在本例中方法里面有什么,僅僅是echo了一句話。為什么 var_dump($t); 會輸出false呢?因為在我們實現的這個offsetExists方法里面,沒有任何的返回值,沒有返回值當然就是null了,也就是false了。

$foo = newFoo();$t = isset($foo['how']);//輸出: 這里是 offsetExists() 方法 你輸入的參數是 how

var_dump($t);//輸出: boolean false

接着看看這種 $foo['xxxx'] 結構還可以怎樣被調用,不如我們這次直接使用$foo['xxxx']看看。原來直接使用 $foo['xxxx']  這種結構也可以調用一個方法啊,從輸出當中得知調用了offsetGet方法,同樣也獲取到了參數。

$foo = newFoo();$foo['what'];//輸出: 這里是 offsetGet() 方法 你輸入的參數是 what

繼續看還能怎么調用到其他的方法,我們給這個結構賦值看看,果然賦值的操作當然是調用offsetSet方法了,同樣的方法內部的實現代碼任然還是你想寫什么就寫什么。

$foo = newFoo();$foo['when'] = 'today';//輸出: 這里是 offsetSet() 方法 你輸入的 when=today

最后一個了,看方法名字也知道是通過unset方法才能被調用了。

$foo = newFoo();unset($foo['wow']);//輸出: 這里是 offsetUnset() 方法 你輸入的參數是 wow

總結

好了,總結一下吧:

如果你的類實現了ArrayAccess接口,那么這個類的對象就可以使用$foo['xxx']這種結構了。

$foo['xxx'] 對應調用offsetGet方法。

$foo['xxx'] = 'yyy' 對應調用offsetSet方法。

isset($foo['xxx']) 對應調用offsetExists方法。

unset($foo['xxx']) 對應調用offsetUnset方法。

再次強調,方法的實現代碼,你想怎么寫就怎么寫。(當然代碼的功能最好是貼近方法名啦)

原創內容,禁止轉載!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值