• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP中生成器和协程是如何实现的

php 搞代码 3年前 (2022-01-21) 16次浏览 已收录 0个评论

本篇文章给大家分享的是关于PHP中生成器和协程是如何实现的,内容很不错,有需要的朋友可以参考一下,希望可以帮助到大家。

先说一些废话

PHP 5.5 以来,新的诸多特性又一次令 PHP 焕发新的光彩,虽然在本文写的时候已是 PHP 7 alpha 2 发布后的一段时间,但此时国内依旧是 php 5.3 的天下。不过我认为新的特性迟早会因为旧的版本的逐渐消失而变得越发重要,尤其是 PHP 7 的正式版出来后,因此本文的目的就是为了在这之前,帮助一些 PHPer 了解一些他们从没有了解的东西。所以打算将以本篇作为博客中 PHP 知识补全 系列文章的开篇。

其实在写本文之前,我对生成器以及基于此特性延伸出来的 php 的协程实现并没有比较直观的了解,主要是我个人水平并不是很高,属于典型的刚入了门的 PHPer。所以在看了前段时间鸟哥(laruence)博客中对协程的讲解(参考链接:《PHP中使用协同程序实现合作多任务》)后,在我个人对本篇的理解上,针对那些比较难以理解的概念(包括我个人在理解这一概念的时候的难点),以一个更为通俗的方式去讲明白。当然由于本人也是刚刚去学习这一概念,所以有些不得当的地方在所难免,希望大神看见了请不吝赐教。

一切从 Iterator 和 Gener*本文来@源gao@daima#com搞(%代@#码@网2

搞代gaodaima码

ator 开始

为便于新入门开发者理解,本文一半篇幅是讲述迭代器接口(Iterator)和 Generator 类的,对此已经理解的话,可以直接跳过。

迭代和迭代器

在理解本文大多数概念前,有必要知道迭代和迭代器。事实上,迭代大家都知道是什么,可是我不知道(真的,在此之前对这个概念没有系统了解)。迭代是指反复执行一个过程,每执行一次叫做一次迭代。实际上我们经常做这种事情,比如:

<?php$mapping = [  'red'  => '#FF0000',  'green' => '#00FF00',  'blue' => '#0000FF'];foreach ($mapping as $key => $value) {  printf("key: %d - value: %s\n", $key, $value);}

我们可以看到通过 foreach 对数组遍历并迭代输出其内容。在这一环节中,我们需要关注的重点是数组。虽然我们迭代的过程是 foreach 语句中的代码块,但实际上数组 $mapping 在每一次迭代中发生了变化,意味着数组内部也存在着一次迭代。如果我们把数组看做一个对象,foreach 实际上在每一次迭代过程都会调用该对象的一个方法,让数组在自己内部进行一次变动(迭代),随后通过另一个方法取出当前数组对象的键和值。这样一个可通过外部遍历其内部数据的对象就是一个迭代器对象,其遵循的统一的访问接口就是迭代器接口(Iterator)。

PHP 提供了一个统一的迭代器接口。关于迭代器 PHP 官方文档有更为详细的描述,建议去了解。

interface Iterator extends Traversable{  /**   * 获取当前内部标量指向的元素的数据   */  public mixed current ( void )  /**   * 获取当前标量   */  public scalar key ( void )  /**   * 移动到下一个标量   */  public void next ( void )  /**   * 重置标量   */  public void rewind ( void )  /**   * 检查当前标量是否有效   */  public boolean valid ( void )}

我们来给出一个实例,去实现一个简单的迭代器:

class Xrange implements Iterator{  protected $start;  protected $limit;  protected $step;  protected $i;  public function __construct($start, $limit, $step = 0)  {    $this->start = $start;    $this->limit = $limit;    $this->step = $step;  }  public function rewind()  {    $this->i = $this->start;  }  public function next()  {    $this->i += $this->step;  }  public function current()  {    return $this->i;  }  public function key()  {    return $this->i + 1;  }  public function valid()  {    return $this->i <= $this->limit;  }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中生成器和协程是如何实现的

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址