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

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

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的源碼,源碼里面大量使用了這些東西,看了之后,你會慢慢覺得“哦~好像還真是挺有用的。。。。”

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 星座| 台湾省| 通渭县| 广东省| 鲁山县| 泾川县| 贺州市| 隆安县| 迁西县| 英山县| 玛纳斯县| 郸城县| 嘉黎县| 察哈| 久治县| 高邑县| 长春市| 铁力市| 包头市| 定西市| 怀宁县| 肃南| 重庆市| 景东| 河东区| 花垣县| 沽源县| 滦南县| 陆河县| 长春市| 华容县| 弥渡县| 万州区| 藁城市| 长春市| 来安县| 神木县| 华蓥市| 泗水县| 梅河口市| 钦州市|