|
导读网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立... 网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。 本篇文章给大家带来的内容是关于php中IteratorIterator的理解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
php之IteratorIterator个人理解最近有重新开始捣鼓laravel的源码了,一年多没用实在是忘的差不多了,每次看都会从中学到很多,不懂就赶紧查手册。看到加载配置文件的部分(config/*.php),代码中大量使用spl类库和接口,今天就来扯一下IteratorIterator类,网上资料太少了,加上本人也不是怎么聪明,搞了好几天才有点眉目,以下是对它的个人理解。 IteratorIterator简介IteratorIterator是一个迭代器包装器,当然它本身也是迭代器。它(假定它叫Outer)在实例化时必须传入一个实现了Traversable接口类型的迭代器实例(假定它叫Inner),当然你可以通过Outer的getInnerIterator方法获取到这个传入的迭代器参数Inner。你可以通过Outer的rewind(),next(),valid(),current()和key()方法对内部迭代器Inner进行处理。 重点理解
代码演示<?php
namespace young;class InnerIterator implements \Iterator{
private $dates;
private $position;
public function __construct($dates = [])
{
$this->dates = $dates;
$this->position = 0;
}
public function rewind()
{
echo 'call ' . __METHOD__ . '<br>';
reset($this->dates);
}
public function valid()
{
echo 'call ' . __METHOD__ . '<br>';
if ($this->position >= count($this->dates)) {
# code...
return false;
}
return true;
}
public function current()
{
echo 'call ' . __METHOD__ . '<br>';
return $this->dates[$this->position];
}
public function key()
{
echo 'call ' . __METHOD__ . '<br>';
return $this->position;
}
public function next()
{
echo 'call ' . __METHOD__ . '<br>';
++$this->position;
}}class OuterIterator extends \IteratorIterator{
function rewind()
{
echo __METHOD__ . '<br>';
return parent::rewind();
}
function valid()
{
echo __METHOD__ . '<br>';
return parent::valid();
}
function current()
{
echo __METHOD__ . '<br>';
return parent::current() . '_suffix';
}
function key()
{
echo __METHOD__ . '<br>';
return parent::key() ;
}
function next()
{
echo __METHOD__ . '<br>';
return parent::next() ;
}
function getInnerIterator()
{
echo __METHOD__ . '<br>';
return parent::getInnerIterator();
}}$tmpArr = array(
'2018-10-01',
'2018-10-02',
//'2018-10-03',);$inner = new InnerIterator($tmpArr);$outer = new OuterIterator($inner);foreach ($outer as $key => $value) {
# code...
echo $key , '=>' , $value . '<hr>';}运行结果:young\OuterIterator::rewind call young\InnerIterator::rewind call young\InnerIterator::valid call young\InnerIterator::current call young\InnerIterator::key young\OuterIterator::valid young\OuterIterator::current young\OuterIterator::key 0=>2018-10-01_suffix young\OuterIterator::next call young\InnerIterator::next call young\InnerIterator::valid call young\InnerIterator::current call young\InnerIterator::key young\OuterIterator::valid young\OuterIterator::current young\OuterIterator::key 1=>2018-10-02_suffix young\OuterIterator::next call young\InnerIterator::next call young\InnerIterator::valid young\OuterIterator::valid
object(young\InnerIterator)#1 (2) {
[“dates”:“young\InnerIterator”:private]=> array(2) { [0]=>
string(10) “2018-10-01” [1]=> string(10) “2018-10-02” }
[“position”:“young\InnerIterator”:private]=> int(2) }结果分析Outer的每次迭代会先调用自己的方法,然后转发给Inner。 一点补充之前在网上翻阅资料时会看到这样的疑惑 //假如这里还是使用了上面的两个类代码
<?php
namespace young;
class InnerIterator implements \Iterator
{
//code 这里的代码假如和上面的一样
}
class OuterIterator extends \IteratorIterator
{
//code 这里的代码假如和上面的一样
}
$outer->valid(); //false
$outer->current(); // _suffix 问题一
$outer->rewind();
$outer->valid(); //true
$outer->current(); //2018-10-01_suffix
$outer->next()
$outer->rewind();
$outer->current(); //2018-10-02_suffix 问题二这里有两个问题,
从上面的运行结果可知,$outer不执行rewind,$inner也不会执行,所以valid返回false,current为null,_suffix只是自己拼接上的。 以上就是对php中IteratorIterator的理解(代码示例)的详细内容,更多请关注php中文网其它相关文章! 网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。 |
温馨提示:喜欢本站的话,请收藏一下本站!