亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

PHP之預定義接口詳解

2024-04-25 20:40:13
字體:
來源:轉載
供稿:網友

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

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

代碼如下:

IteratorAggregate extends Traversable {

abstract 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 => yanruitao

c => 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);

//返回1

class CountMe implements Countable

{

protected $_myCount = 3;

public function count()

{

return $this->_myCount;

}

}

$countable = new CountMe();

echo count($countable);

//返回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)

}

class CountMe

{

protected $_myCount = 3;

public function count()

{

return $this->_myCount;

}

}

$countable = new CountMe();

echo count($countable);

//返回1

class CountMe implements Countable

{

protected $_myCount = 3;

public function count()

{

return $this->_myCount;

}

}

$countable = new CountMe();

echo count($countable);

//返回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 : name

offsetUnset : name

offsetGet : yrt

class 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, IteratorAggregate

{

private $_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 => false

1 => '燕睿濤'

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

總結

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

以上就是本文全部介紹,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久97| 欧美日韩中文字幕在线| 亚洲国产精品小视频| 亚洲va欧美va在线观看| 91精品久久久久久久久| 爽爽爽爽爽爽爽成人免费观看| 91精品国产高清自在线看超| 日本精品一区二区三区在线播放视频| 亚洲无线码在线一区观看| 日韩精品电影网| 久久琪琪电影院| 国产精品视频专区| 日本欧美爱爱爱| 成人免费看吃奶视频网站| 国产69精品久久久久久| 精品国产老师黑色丝袜高跟鞋| xxx成人少妇69| 中文字幕国产日韩| 69国产精品成人在线播放| 欧美日韩亚洲激情| 国产玖玖精品视频| 91国偷自产一区二区三区的观看方式| 国产噜噜噜噜噜久久久久久久久| 国产欧美久久久久久| 亲子乱一区二区三区电影| 欧美激情精品久久久久久黑人| 亚洲最大av在线| 免费99精品国产自在在线| 草民午夜欧美限制a级福利片| 91免费观看网站| 欧日韩不卡在线视频| 欧美激情va永久在线播放| 精品国产31久久久久久| 91精品国产综合久久久久久久久| 91九色国产在线| 日韩中文字幕网址| 亚洲黄色av女优在线观看| 国产精品∨欧美精品v日韩精品| 欧美小视频在线观看| 国产精品久久久久久av福利软件| 日韩av在线一区| 亚洲精品视频网上网址在线观看| 亚洲日韩欧美视频一区| 久久精品视频免费播放| 亚洲综合日韩中文字幕v在线| 欧美亚洲午夜视频在线观看| 亚洲免费精彩视频| 国产精品日韩欧美| 精品视频久久久| 91精品免费久久久久久久久| 国产精品久久久久久久app| 欧美日韩一区免费| 欧美日韩国产麻豆| 久久视频这里只有精品| 久久久精品在线观看| 国产精品精品久久久久久| 亚洲国产天堂久久综合网| 亚洲毛片在线观看| 亚洲天堂av在线免费观看| 96精品久久久久中文字幕| 97在线视频免费| 亚洲免费视频一区二区| 亚洲高清一二三区| 亚洲电影在线看| 一区二区欧美久久| 91av在线免费观看视频| 国产91在线播放九色快色| 欧美激情综合色| 国产精品美女在线| 日韩av一区二区在线| 久久久久久国产三级电影| 色琪琪综合男人的天堂aⅴ视频| 日韩av电影在线网| 久久久久久久久91| 亚洲国模精品私拍| 91久久精品美女高潮| 精品国产乱码久久久久久婷婷| 国产日韩中文字幕在线| 亚洲专区在线视频| 国产91在线播放九色快色| 国产成人精品日本亚洲| 国产精品久久久久久久久免费看| 欧美性色19p| 亚洲性视频网址| 国产亚洲精品久久久久久牛牛| 中文字幕日韩av| 国产999精品| 26uuu久久噜噜噜噜| 国产精品一区二区3区| 久久欧美在线电影| 亚洲午夜小视频| 91精品久久久久久久久| 日韩亚洲欧美成人| 久久精彩免费视频| 一区二区欧美亚洲| 91久久精品一区| 亚洲综合中文字幕68页| 欧美日韩激情美女| 久久精品欧美视频| 久久精品人人爽| 色天天综合狠狠色| 欧美激情一区二区三区成人| 久久99青青精品免费观看| 欧美成人免费视频| 在线激情影院一区| 欧美日韩国产一区中文午夜| 国产噜噜噜噜久久久久久久久| 国产精品久久久久久久久久ktv| 色先锋久久影院av| 92国产精品视频| 久久免费视频观看| 成人黄色免费在线观看| 久久综合免费视频影院| 欧美性极品少妇精品网站| 国内精品小视频| 亚洲精品一区二区三区不| 欧美老女人bb| 91沈先生在线观看| 久久人人爽人人爽人人片亚洲| 亚洲国产成人精品久久久国产成人一区| 国产精品白嫩美女在线观看| 岛国av一区二区在线在线观看| 少妇av一区二区三区| 在线视频欧美日韩| 欧美激情一区二区久久久| 国产精品久久久久久av福利软件| 亚洲人成伊人成综合网久久久| 欧美成人精品在线播放| 91网站免费看| 欧美另类极品videosbest最新版本| 国产精品美女免费看| 国产精品吊钟奶在线| 精品国产精品三级精品av网址| 欧美在线观看一区二区三区| 国产精品久久久久久av福利| 亚洲999一在线观看www| 欧美激情三级免费| 亚洲色图国产精品| 久久久久久久久久久91| 亚洲国产日韩欧美在线动漫| 日韩在线不卡视频| 中文字幕成人精品久久不卡| 久久综合久久88| 精品国产欧美成人夜夜嗨| 国产精品免费在线免费| 91久久嫩草影院一区二区| 日韩精品免费视频| 日本成人精品在线| 久久视频中文字幕| 亚洲人成网站色ww在线| 亚洲另类激情图| 亚洲香蕉在线观看| 这里只有精品丝袜| 国产精品久久久久久久久久久久久久| 欧美激情精品久久久| 亚洲视频免费一区| 日韩国产一区三区| 欧美性猛交xxxx乱大交| 国产精品羞羞答答| 亚洲天堂av在线免费观看| 日韩在线观看视频免费| 国产精品第一视频| 最近2019年中文视频免费在线观看| 欧洲s码亚洲m码精品一区|