欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP之預(yù)定義接口詳解

 更新時間:2015年07月29日 09:38:33   作者:奔跑的Man  
這篇文章主要整理了PHP之預(yù)定義接口,在平時項目過程中比較常用的四個接口:IteratorAggregate(聚合式aggregate迭代器Iterator)、Countable、ArrayAccess、Iterator,需要的朋友可以參考下

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

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


復(fù)制代碼 代碼如下:

IteratorAggregate extends Traversable {
 abstract public Traversable getIterator(void)
}

這個接口實現(xiàn)了一個功能——創(chuàng)建外部迭代器,具體怎么理解呢,當(dāng)我們使用foreach對對象進(jìn)行便遍歷的時候,如果沒有繼承IteratorAggregate接口,遍歷的是對象中所有的public屬性(只能是public $var這種形式)。要是繼承了IteratorAggregate,會使用類中實現(xiàn)的getIterator方法返回的對象,這里要注意返回的一定要是一個Traversable對象或者擴(kuò)展自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 => yanruitao
c => LULU

Countable接口

復(fù)制代碼 代碼如下:

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

這個接口的作用是讓我們可以像訪問數(shù)組一樣訪問對象,這個怎么說好呢,我猜其實就是php在詞法分析的時候如果碰到了數(shù)組的方式使用對象,就回去對象中查找是否有實現(xiàn)ArrayAccess如果有的話,進(jìn)行對應(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 : 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

上面的對象只能是基本的數(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)部迭代自己的外部迭代器或類的接口,這是官方文檔給出的解釋,看著還是不好理解,其實我感覺這個接口實現(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 => false
1 => '燕睿濤'


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


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

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

相關(guān)文章

  • 使用PHP uniqid函數(shù)生成唯一ID

    使用PHP uniqid函數(shù)生成唯一ID

    生成唯一ID的應(yīng)用場景非常普遍,如臨時緩存文件名稱,臨時變量,臨時安全碼等,uniqid()函數(shù)基于以微秒計的當(dāng)前時間,生成一個唯一的 ID。由于生成唯一ID與微秒時間關(guān)聯(lián),因此ID的唯一性非??煽?/div> 2015-11-11
  • Yii實現(xiàn)簡單分頁的方法

    Yii實現(xiàn)簡單分頁的方法

    這篇文章主要介紹了Yii實現(xiàn)簡單分頁的方法,涉及Yii模型調(diào)用讀取數(shù)據(jù)及視圖操作相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • WordPress中的shortcode短代碼功能使用詳解

    WordPress中的shortcode短代碼功能使用詳解

    WordPress中的短代碼能通過簡單的函數(shù)集合創(chuàng)建宏代碼來生成內(nèi)容,方便函數(shù)調(diào)用,下面就讓我們一起來看一下WordPress中的shortcode短代碼功能使用詳解.
    2016-05-05
  • 完美解決在ThinkPHP控制器中命名空間的問題

    完美解決在ThinkPHP控制器中命名空間的問題

    下面小編就為大家?guī)硪黄昝澜鉀Q在ThinkPHP控制器中命名空間的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • php解析xml 的四種簡單方法(附實例)

    php解析xml 的四種簡單方法(附實例)

    下面小編就為大家?guī)硪黄猵hp解析xml 的四種簡單方法(附實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 教你如何開啟shopnc b2b2c 偽靜態(tài)

    教你如何開啟shopnc b2b2c 偽靜態(tài)

    最近要給一個shopnc網(wǎng)站開啟偽靜態(tài),用的是shopnc b2b2c,在網(wǎng)上搜索了好多shopnc開啟偽靜態(tài)的方法,但都是針對shaopnc c2c的,沒有關(guān)于shopnc b2b2c的,最后終于找到了shopnc b2b2c怎么開啟偽靜態(tài)。
    2014-10-10
  • php遞歸獲取目錄內(nèi)文件(包含子目錄)封裝類分享

    php遞歸獲取目錄內(nèi)文件(包含子目錄)封裝類分享

    php遞歸獲取目錄內(nèi)文件封裝類分享,可以遞歸子目錄
    2013-12-12
  • PHP--用萬網(wǎng)的接口實現(xiàn)域名查詢功能

    PHP--用萬網(wǎng)的接口實現(xiàn)域名查詢功能

    PHP用萬網(wǎng)的接口實現(xiàn)域名查詢功能,需要的朋友可以了解下
    2012-12-12
  • PHP curl模擬登錄帶驗證碼的網(wǎng)站

    PHP curl模擬登錄帶驗證碼的網(wǎng)站

    最近接了個項目,其中有需求是要登錄帶驗證碼的網(wǎng)站,獲取數(shù)據(jù),但是我們不可能人為的一直去記錄數(shù)據(jù),想通過自動采集的方式進(jìn)行,下面小編給大家?guī)淼南嚓P(guān)代碼,對php curl 模擬登錄帶驗證碼的網(wǎng)站感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • php 升級到 5.3+ 后出現(xiàn)的一些錯誤,如 ereg(); ereg_replace(); 函數(shù)報錯

    php 升級到 5.3+ 后出現(xiàn)的一些錯誤,如 ereg(); ereg_replace(); 函數(shù)報錯

    這篇文章主要介紹了php 升級到 5.3+ 后出現(xiàn)的一些錯誤,如 ereg(); ereg_replace(); 函數(shù)報錯 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12

最新評論