在PHP中有好幾個預定義的接口,比較常用的四個接口(IteratorAggregate(聚合式aggregate迭代器Iterator)、Countable、ArrayAccess、Iterator)分別給大家詳細介紹下。
IteratorAggregate(聚合式aggregate迭代器Iterator)接口
IteratorAggregate extends Traversable { abstract html' target='_blank'>public Traversable getIterator(void)}
這個接口實現了一個功能——創建外部迭代器,具體怎么理解呢,當我們使用foreach對對象進行便遍歷的時候,如果沒有繼承IteratorAggregate接口,遍歷的是對象中所有的public屬性(只能是public $var這種形式)。要是繼承了IteratorAggregate,會使用類中實現的getIterator方法返回的對象,這里要注意返回的一定要是一個Traversable對象或者擴展自Traversable的對象,否則會拋出異常
//看個例子class My{ private $_data = [ a = 燕睿濤 , b = yanruitao , c = LULU , public function getIterator() return new ArrayIterator($this- _data);$obj = new My;foreach ($obj as $key = $value) { echo $key = $value/n //輸出結果為空 class My implements IteratorAggregate { private $_data = [ a = 燕睿濤 , b = yanruitao , c = LULU , public function getIterator() return new ArrayIterator($this- _data);$obj = new My;foreach ($obj as $key = $value) { echo $key = $value/n //結果:a = 燕睿濤b = yanruitaoc = LULU
Countable接口
Countable { abstract public int count(void)}
這個接口用于統計對象的數量,具體怎么理解呢,當我們對一個對象調用count的時候,如果函數沒有繼承Countable將一直返回1,如果繼承了Countable會返回所實現的count方法所返回的數字,看看下面的例子:
class CountMe protected $_myCount = 3; public function count() return $this- _myCount; $countable = new CountMe(); echo count($countable);//返回1class CountMe implements Countable protected $_myCount = 3; public function count() return $this- _myCount; $countable = new CountMe(); echo count($countable); //返回3
abstract public boolean offsetExists(mixed $offset) abstract public mixed offsetGet(mixed $offset) public void offsetSet(mixed $offset, mixed $value) public void offsetUnset(mixed $offset)
//返回3
ArrayAccess接口
ArrayAccess { abstract public boolean offsetExists(mixed $offset) abstract public mixed offsetGet(mixed $offset) public void offsetSet(mixed $offset, mixed $value) public void offsetUnset(mixed $offset)}
這個接口的作用是讓我們可以像訪問數組一樣訪問對象,這個怎么說好呢,我猜其實就是php在詞法分析的時候如果碰到了數組的方式使用對象,就回去對象中查找是否有實現ArrayAccess如果有的話,進行對應的操作(set、unset、isset、get),這樣我們就可以在類里面放置一個array,讓類實現數組方式的基本操作,下面看個例子:
class myObj$obj = new myObj;$obj[ name //Fatal error: Cannot use object of type myObj as array in class myObj implements ArrayAccess public function offsetSet($offset, $value) echo offsetSet : {$offset} = {$value}/n public function offsetExists($offset) echo offsetExists : {$offset}/n public function offsetUnset($offset) echo offsetUnset : {$offset}/n public function offsetGet($offset) echo offsetGet : {$offset}/n $obj = new myObj;$obj[1] = 燕睿濤 isset($obj[ name unset($obj[ name $obj[ yrt //輸出結果:offsetSet : 1 = 燕睿濤offsetExists : nameoffsetUnset : nameoffsetGet : yrtclass myObj implements ArrayAccess private $_data = []; public function offsetSet($offset, $value) $this- _data[$offset] = $value; public function offsetExists($offset) return isset($this- _data[$offset]); public function offsetUnset($offset) unset($this- _data[$offset]); public function offsetGet($offset) return $this- _data[$offset];$obj = new myObj;$obj[ yrt ] = 燕睿濤 var_dump($obj[ yrt var_dump(isset($obj[ yrt ]));unset($obj[ yrt var_dump(isset($obj[ yrt ]));var_dump($obj[ yrt //輸出:string(9) 燕睿濤 bool(true)bool(false)Notice: Undefined index: yrt //最后一個會報出Notice
上面的對象只能是基本的數組操作,連遍歷都不行,結合之前的IteratorAggregate可以進行foreach:
class myObj implements ArrayAccess, IteratorAggregateprivate $_data = []; public function getIterator() return new ArrayIterator($this- _data); ......$obj = new myObj;$obj[ yrt ] = 燕睿濤 $obj[1] = 燕睿濤 $obj[ name ] = 燕睿濤 $obj[ age ] = 23;foreach ($obj as $key = $value) { echo {$key} = {$value}/n //輸出:yrt = 燕睿濤1 = 燕睿濤name = 燕睿濤age = 23
Iterator接口:
Iterator extends Traversable { abstract public mixed current(void) abstract public scalar key(void) abstract public void next(void) abstract public void rewind(void) abstract public boolean valid(void)}
可在內部迭代自己的外部迭代器或類的接口,這是官方文檔給出的解釋,看著還是不好理解,其實我感覺這個接口實現的功能和trratorAggregate(文檔:創建外部迭代器接口,接口直接返回一個迭代器)類似,不過這個在類的定義里面自己實現了,看個例子:
class myObj implements Iterator{ private $_data = []; public function __construct(Array $arr) $this- _data = $arr; public function current() return current($this- _data); public function key() return key($this- _data); public function next() next($this- _data); public function rewind() reset($this- _data); public function valid() return $this- key() !== NULL;$t = [ yrt = 燕睿濤 , name = 燕睿濤 , false, 燕睿濤 $obj = new myObj($t);foreach ($obj as $key = $value) { echo {$key} = .var_export($value, true). /n //輸出:yrt = 燕睿濤 name = 燕睿濤 0 = false1 = 燕睿濤
上面這個參考了鳥哥的一篇文章關于一筆試題(Iterator模式),不過鳥哥的那個判斷valid有點瑕疵,當碰到值北來就是false的時候就會截斷
總結
說了這么多好像還是沒有體會到他們的用處,建議看看Yii2的源碼,源碼里面大量使用了這些東西,看了之后,你會慢慢覺得“哦~好像還真是挺有用的。。。?!?/p>
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
如何通過PHP獲取當前頁面URL函數
php后臺如何避免用戶直接進入的代碼分析
以上就是PHP的預定義接口解析的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答