首頁 後端開發 php教程 PHP之预定义接口详解_php实例

PHP之预定义接口详解_php实例

Jun 07, 2016 pm 05:12 PM
php介面 php介面開發

在PHP中有好几个预定义的接口,比较常用的四个接口(IteratorAggregate(聚合式aggregate迭代器Iterator)CountableArrayAccessIterator)分别给大家详细介绍下。

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的源码,源码里面大量使用了这些东西,看了之后,你会慢慢觉得“哦~好像还真是挺有用的。。。。”

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
如何利用php介面和ECharts產生可視化的統計圖表 如何利用php介面和ECharts產生可視化的統計圖表 Dec 18, 2023 am 11:39 AM

在今天數據視覺化變得越來越重要的背景下,許多開發者都希望能夠利用各種工具,快速產生各種圖表與報表,以便能夠更好的展示數據,幫助決策者快速做出判斷。而在此背景下,利用Php介面和ECharts函式庫可以幫助許多開發者快速產生可視化的統計圖表。本文將詳細介紹如何利用Php介面和ECharts庫產生視覺化的統計圖表。在具體實作時,我們將使用MySQL

PHP 介面開發教學:實作企業微信群組管理功能 PHP 介面開發教學:實作企業微信群組管理功能 Sep 12, 2023 am 11:57 AM

PHP介面開發教學:實作企業微信群組管理功能引言:隨著企業微信的流行,越來越多的企業開始使用企業微信作為溝通和協作工具。然而,企業微信的功能還不夠完善,無法直接進行群組管理。本文將介紹如何使用PHP介面開發,實現企業微信群組管理功能,幫助企業更好地運用企業微信進行協作與管理。一、了解企業微信接口企業微信提供了一系列的開放接口,可以透過這些接口來實現各種

如何透過ECharts和php介面實現即時統計圖的展示 如何透過ECharts和php介面實現即時統計圖的展示 Dec 17, 2023 pm 04:35 PM

如何透過ECharts和PHP介面實現即時統計圖的展示隨著互聯網和大數據技術的快速發展,數據視覺化成為了重要的一環。而ECharts作為一款優秀的開源JavaScript資料視覺化函式庫,能夠幫助我們簡單、有效率地實作各種統計圖的展示。本文將介紹如何透過ECharts和PHP介面實現即時統計圖的展示,並提供相關程式碼範例。一、前期準備在開始之前,我們需要做一些準備工

如何結合ECharts和php介面實現統計圖的動態更新 如何結合ECharts和php介面實現統計圖的動態更新 Dec 17, 2023 pm 03:47 PM

如何結合ECharts和PHP介面實現統計圖的動態更新引言:資料視覺化在現代應用程式中起著至關重要的作用。 ECharts是一個優秀的JavaScript圖表庫,可以幫助我們輕鬆建立各種類型的統計圖表。而PHP則是廣泛應用於伺服器端開發的腳本語言。透過結合ECharts和PHP接口,我們可以實現統計圖的動態更新,使圖表能夠根據即時數據的變化進行自動更新。本

什麼是SPL接口(例如,迭代器,可計數,ArrayAccess),為什麼使用它們? 什麼是SPL接口(例如,迭代器,可計數,ArrayAccess),為什麼使用它們? Apr 04, 2025 am 12:01 AM

SPL接口在PHP中包括Iterator、Countable和ArrayAccess。 1.Iterator接口使對象可遍歷,定義了current()、key()、next()、rewind()和valid()方法。 2.Countable接口讓對象報告元素數量,定義了count()方法。 3.ArrayAccess接口允許對象像數組一樣被訪問和修改,定義了offsetExists()、offsetGet()、offsetSet()和offsetUnset()方法。這些接口提升了代碼的效率和可維護性。

深入理解PHP介面的定義與使用方法 深入理解PHP介面的定義與使用方法 Mar 24, 2024 am 08:45 AM

深入理解PHP介面的定義與使用方法PHP是一種強大的伺服器端腳本語言,廣泛應用於Web開發領域。在PHP中,介面(interface)是一種重要的概念,它可以用來定義一組方法的規範,而不關心方法的具體實作。本文將深入探討PHP介面的定義與使用方法,並提供具體的程式碼範例。 1.什麼是介面?在物件導向程式設計中,介面是一種抽象的概念,它定義了一組方法的規範,但沒有具

如何透過ECharts和php介面實現統計圖的資料驗證和校驗 如何透過ECharts和php介面實現統計圖的資料驗證和校驗 Dec 18, 2023 pm 02:13 PM

如何透過ECharts和PHP介面實現統計圖的資料驗證和校驗隨著資料視覺化的需求增加,ECharts成為了一個非常流行的資料視覺化工具。而PHP作為常見的後端腳本語言,也廣泛應用於Web開發。本文將介紹如何透過ECharts和PHP介面實現統計圖的資料驗證和校驗,並提供具體的程式碼範例。首先,我們需要了解ECharts。 ECharts是一個由百度開發的開

如何透過php介面和ECharts產生可互動的統計圖表 如何透過php介面和ECharts產生可互動的統計圖表 Dec 18, 2023 pm 01:07 PM

在現代化的應用程式中,資料的視覺化變得越來越流行。統計圖表是一種很好的資料視覺化方式,可以輕鬆地幫助使用者了解資料的趨勢。 ECharts是一個強大的前端圖錶框架,它提供了豐富的圖表類型和互動功能。 Php是一種非常流行的後端語言,可以輕鬆地產生動態內容和介面。在本文中,我們將介紹如何使用php介面和ECharts產生可互動的統計圖表,並提供具體的程式碼範例。一、

See all articles