本篇文章為大家展示了PHP中有哪些預(yù)定義接口,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

IteratorAggregate(聚合式aggregate迭代器Iterator)接口
代碼如下:
IteratorAggregate extends Traversable {
abstract public Traversable getIterator(void)
}
這個(gè)接口實(shí)現(xiàn)了一個(gè)功能——?jiǎng)?chuàng)建外部迭代器,具體怎么理解呢,當(dāng)我們使用foreach對(duì)對(duì)象進(jìn)行便遍歷的時(shí)候,如果沒有繼承IteratorAggregate接口,遍歷的是對(duì)象中所有的public屬性(只能是public $var這種形式)。要是繼承了IteratorAggregate,會(huì)使用類中實(shí)現(xiàn)的getIterator方法返回的對(duì)象,這里要注意返回的一定要是一個(gè)Traversable對(duì)象或者擴(kuò)展自Traversable的對(duì)象,否則會(huì)拋出異常
//看個(gè)例子
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 => yanruitao
c => LULUCountable接口
代碼如下:
Countable {
abstract public int count(void)
}
這個(gè)接口用于統(tǒng)計(jì)對(duì)象的數(shù)量,具體怎么理解呢,當(dāng)我們對(duì)一個(gè)對(duì)象調(diào)用count的時(shí)候,如果函數(shù)沒有繼承Countable將一直返回1,如果繼承了Countable會(huì)返回所實(shí)現(xiàn)的count方法所返回的數(shù)字,看看下面的例子:
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);
//返回3ArrayAccess接口
復(fù)制代碼 代碼如下:
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)
}
這個(gè)接口的作用是讓我們可以像訪問數(shù)組一樣訪問對(duì)象,這個(gè)怎么說好呢,我猜其實(shí)就是php在詞法分析的時(shí)候如果碰到了數(shù)組的方式使用對(duì)象,就回去對(duì)象中查找是否有實(shí)現(xiàn)ArrayAccess如果有的話,進(jìn)行對(duì)應(yīng)的操作(set、unset、isset、get),這樣我們就可以在類里面放置一個(gè)array,讓類實(shí)現(xiàn)數(shù)組方式的基本操作,下面看個(gè)例子:
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 : 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 //最后一個(gè)會(huì)報(bào)出Notice上面的對(duì)象只能是基本的數(shù)組操作,連遍歷都不行,結(jié)合之前的IteratorAggregate可以進(jìn)行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 => 23Iterator接口:
復(fù)制代碼 代碼如下:
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)部迭代自己的外部迭代器或類的接口,這是官方文檔給出的解釋,看著還是不好理解,其實(shí)我感覺這個(gè)接口實(shí)現(xiàn)的功能和trratorAggregate(文檔:創(chuàng)建外部迭代器接口,接口直接返回一個(gè)迭代器)類似,不過這個(gè)在類的定義里面自己實(shí)現(xiàn)了,看個(gè)例子:
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 => '燕睿濤'上述內(nèi)容就是PHP中有哪些預(yù)定義接口,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前文章:PHP中有哪些預(yù)定義接口-創(chuàng)新互聯(lián)
鏈接地址:http://www.chinadenli.net/article38/iiesp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容