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

PHP的多任务协程处理的分析

php 搞代码 3年前 (2022-01-21) 19次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了关于PHP的多任务协程处理,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

那么,开始吧!

这就是本文我们要讨论的问题。不过我们会从更简单更熟悉的示例开始。

一切从数组开始

我们可以通过简单的遍历来使用数组:

$array = ["foo", "bar", "baz"]; foreach ($array as $key => $value) {    print "item: " . $key . "|" . $value . "\n";} for ($i = 0; $i < count($array); $i++) {    print "item: " . $i . "|" . $array[$i] . "\n";}

这是我们日常编码所依赖的基本实现。可以通过遍历数组获取每个元素的键名和键值。

当然,如果我们希望能够知道在何时可以使用数组。PHP 提供了一个方便的内置函数:

print is_array($array) ? "yes" : "no"; // yes

类数组处理

有时,我们需要对一些数据使用相同的方式进行遍历处理,但它们并非数组类型。比如对 DOMDocument 类进行处理:

$document = new DOMDocument();$document->loadXML("<p></p>");$elements = $document->getElementsByTagName("p");print_r($elements); // DOMNodeList Object ( [length] => 1 )

这显然不是一个数组,但是它有一个 length 属性。我们能像遍历数组一样,对其进行遍历么?我们可以判断它是否实现了下面这个特殊的接口:

print ($elements instanceof Traversable) ? "yes" : "no"; // yes

这真的太有用了。它不会导致我们在遍历非可遍历数据时触发错误。我们仅需在处理前进行检测即可。

不过,这会引发另外一个问题:我们能否让自定义类也拥有这个功能呢?回答是肯定的!第一个实现方法类似如下:

class MyTraversable implements Traversable{    //  在这里编码...}

如果我们执行这个类,我们将看到一个错误信息:

PHP Fatal error: Class MyTraversable must implement interface Traversable as part of either Iterator or IteratorAggregate

Iterato本文来源gao@daima#com搞(%代@#码@网&搞gaodaima代码r(迭代器)

我们无法直接实现 Traversable,但是我们可以尝试第二种方案:

class MyTraversable implements Iterator{    //  在这里编码...}

这个接口需要我们实现 5 个方法。让我们完善我们的迭代器:

class MyTraversable implements Iterator{    protected $data;    protected $index = 0;    public function __construct($data)    {        $this->data = $data;    }    public function current()    {        return $this->data[$this->index];    }    public function next()    {        return $this->data[$this->index++];    }    public function key()    {        return $this->index;    }    public function rewind()    {        $this->index = 0;    }    public function valid()    {        return $this->index < count($this->data);    }}

这边我们需要注意几个事项:

  1. 我们需要存储构造器方法传入的 $data 数组,以便后续我们可以从中获取它的元素。

  2. 还需要一个内部索引(或指针)来跟踪 currentnext 元素。

  3. rewind() 仅仅重置 index 属性,这样 current()next() 才能正常工作。


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

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

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

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

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