溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中有哪些預(yù)定義接口

發(fā)布時(shí)間:2021-07-29 16:25:37 來(lái)源:億速云 閱讀:121 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

本篇文章為大家展示了PHP中有哪些預(yù)定義接口,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(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í)候,如果沒(méi)有繼承IteratorAggregate接口,遍歷的是對(duì)象中所有的public屬性(只能是public $var這種形式)。要是繼承了IteratorAggregate,會(huì)使用類(lèi)中實(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 => LULU

Countable接口

代碼如下:


Countable {
 abstract public int count(void)
}

這個(gè)接口用于統(tǒng)計(jì)對(duì)象的數(shù)量,具體怎么理解呢,當(dāng)我們對(duì)一個(gè)對(duì)象調(diào)用count的時(shí)候,如果函數(shù)沒(méi)有繼承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); 
//返回3

ArrayAccess接口

復(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è)接口的作用是讓我們可以像訪問(wèn)數(shù)組一樣訪問(wèn)對(duì)象,這個(gè)怎么說(shuō)好呢,我猜其實(shí)就是php在詞法分析的時(shí)候如果碰到了數(shù)組的方式使用對(duì)象,就回去對(duì)象中查找是否有實(shí)現(xiàn)ArrayAccess如果有的話,進(jìn)行對(duì)應(yīng)的操作(set、unset、isset、get),這樣我們就可以在類(lèi)里面放置一個(gè)array,讓類(lèi)實(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 => 23

Iterator接口:

復(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)部迭代自己的外部迭代器或類(lèi)的接口,這是官方文檔給出的解釋?zhuān)粗€是不好理解,其實(shí)我感覺(jué)這個(gè)接口實(shí)現(xiàn)的功能和trratorAggregate(文檔:創(chuàng)建外部迭代器接口,接口直接返回一個(gè)迭代器)類(lèi)似,不過(guò)這個(gè)在類(lèi)的定義里面自己實(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)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI