国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP的預(yù)定義接口解析

2020-03-22 19:25:40
字體:
供稿:網(wǎng)友
這篇文章主要整理了PHP之預(yù)定義接口,在平時項目過程中比較常用的四個接口:IteratorAggregate(聚合式aggregate迭代器Iterator)、Countable、ArrayAccess、Iterator,需要的朋友可以參考下

在PHP中有好幾個預(yù)定義的接口,比較常用的四個接口(IteratorAggregate(聚合式aggregate迭代器Iterator)、Countable、ArrayAccess、Iterator)分別給大家詳細介紹下。

IteratorAggregate(聚合式aggregate迭代器Iterator)接口

IteratorAggregate extends Traversable { abstract html' target='_blank'>public Traversable getIterator(void)}

這個接口實現(xiàn)了一個功能——創(chuàng)建外部迭代器,具體怎么理解呢,當(dāng)我們使用foreach對對象進行便遍歷的時候,如果沒有繼承IteratorAggregate接口,遍歷的是對象中所有的public屬性(只能是public $var這種形式)。要是繼承了IteratorAggregate,會使用類中實現(xiàn)的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 //輸出結(jié)果為空 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 //結(jié)果:a = 燕睿濤b = yanruitaoc = LULU

Countable接口

Countable { abstract public int count(void)}

這個接口用于統(tǒng)計對象的數(shù)量,具體怎么理解呢,當(dāng)我們對一個對象調(diào)用count的時候,如果函數(shù)沒有繼承Countable將一直返回1,如果繼承了Countable會返回所實現(xiàn)的count方法所返回的數(shù)字,看看下面的例子:

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)}

這個接口的作用是讓我們可以像訪問數(shù)組一樣訪問對象,這個怎么說好呢,我猜其實就是php在詞法分析的時候如果碰到了數(shù)組的方式使用對象,就回去對象中查找是否有實現(xiàn)ArrayAccess如果有的話,進行對應(yīng)的操作(set、unset、isset、get),這樣我們就可以在類里面放置一個array,讓類實現(xiàn)數(shù)組方式的基本操作,下面看個例子:

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 //輸出結(jié)果: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

上面的對象只能是基本的數(shù)組操作,連遍歷都不行,結(jié)合之前的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)}

可在內(nèi)部迭代自己的外部迭代器或類的接口,這是官方文檔給出的解釋,看著還是不好理解,其實我感覺這個接口實現(xiàn)的功能和trratorAggregate(文檔:創(chuàng)建外部迭代器接口,接口直接返回一個迭代器)類似,不過這個在類的定義里面自己實現(xiàn)了,看個例子:

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 = 燕睿濤 

上面這個參考了鳥哥的一篇文章關(guān)于一筆試題(Iterator模式),不過鳥哥的那個判斷valid有點瑕疵,當(dāng)碰到值北來就是false的時候就會截斷

總結(jié)
說了這么多好像還是沒有體會到他們的用處,建議看看Yii2的源碼,源碼里面大量使用了這些東西,看了之后,你會慢慢覺得“哦~好像還真是挺有用的。。。。”

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請關(guān)注PHP !

相關(guān)推薦:

如何通過PHP獲取當(dāng)前頁面URL函數(shù)

php后臺如何避免用戶直接進入的代碼分析

以上就是PHP的預(yù)定義接口解析的詳細內(nèi)容,PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 博野县| 华宁县| 湖州市| 噶尔县| 孝义市| 麻栗坡县| 方正县| 宁安市| 兴仁县| 阜城县| 剑河县| 安福县| 钟祥市| 镇江市| 双鸭山市| 敦化市| 宁国市| 广灵县| 延津县| 天津市| 荣昌县| 永定县| 甘泉县| 房产| 眉山市| 柏乡县| 河间市| 澎湖县| 乌兰察布市| 固阳县| 奉化市| 翼城县| 黄骅市| 师宗县| 得荣县| 建湖县| 金溪县| 惠来县| 蓬安县| 沅江市| 兴安县|