`
txf2004
  • 浏览: 7040369 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

php5中Iterator与smarty整合 - 马永占 译

阅读更多
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/mayongzhan - 马永占,myz,mayongzhan

php5中Iterator与smarty整合

Iterator(迭代器)在PHP5中是非常重要的,我注意到Iterator在Smarty中不能正常的工作。
Smarty会自动将一个object(对象)转换成array(数组),所以当年在Smarty中循环输出一个object时,模板会自动循环这个object的属性。
例如,建立一个类,然后在函数中定义某些要循环的部分,将这些部分放到protected类型的$_data变量中。
<?php
class MyClass implements Iterator
{
protected $_data = array();

public function rewind()
{
reset($this->_data);
}

public function current()
{
return current($this->_data);
}

public function key()
{
return key($this->_data);
}

public function next()
{
return next($this->_data);
}

public function valid()
{
return $this->current() !== false;
}

public function size()
{
return count($this->_data);
}
}
?>
然后在Smarty使用这个类
{foreach from=$myClassObj item=row}
{$row}
{/foreach}
这样不会输出想要的结果,下面做一下简单的修改,将$myClassObj改成$myClassObj->getData():
{foreach from=$myClassObj->getData() item=row}
{$row}
{/foreach}
这样就能输出正确的结果了。


phpRiot.com: Using the PHP 5 Iterator interface with Smarty

The PHP 5 Iterator interface is very useful for defining custom behaviour for looping over objects, however I just noticed that looping over such objects in Smarty will not work correctly.

Smarty will in fact cast an object back to an array, so when you loop over it, the template will loop over the object's properties (as opposed to using the rules defined by the Iterator methods).

For example, I used code similar to the following to create a class over which I can loop. This lets me loop over the protected $_data array.

<?php
class MyClass implements Iterator
{
protected $_data = array();

public function rewind()
{
reset($this->_data);
}

public function current()
{
return current($this->_data);
}

public function key()
{
return key($this->_data);
}

public function next()
{
return next($this->_data);
}

public function valid()
{
return $this->current() !== false;
}

public function size()
{
return count($this->_data);
}
}
?>

What I want to be able to do is loop over each element in the array with the following code:

{foreach from=$myClassObj item=row}
{$row}
{/foreach}

However, this will not work as expected in Smarty. To get around, I implemented as method called getData() which simply returned the array. This meant my template had to look as follows:

{foreach from=$myClassObj->getData() item=row}
{$row}
{/foreach}

It's a bit annoying to have to do this, since in some ways it defeats the purpose of the using the Iterator interface, but I guess sometimes small sacrifices need to be made.

分享到:
评论

相关推荐

    一个Iterator的实例1---马克-to-win java视频

    一个Iterator的实例1---马克-to-win java视频迭代器的详细描述

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    java-util-iterator.pdf java-util-iterator.pdf

    根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...

    一个Iterator的实例2---马克-to-win java视频

    一个Iterator的实例2---马克-to-win java视频的详细描述

    分析-Iterator-base12与-Container-base12

    分析-Iterator-base12与-Container-base12

    Go-jsoniterator(jsoniter)-速度比DOM快比SAX或StAX更有用

    标题中的“Go-jsoniterator(jsoniter)-速度比DOM快比SAX或StAX更有用”揭示了`jsoniter`的核心优势:速度和实用性。下面将详细探讨`jsoniter`库及其与DOM、SAX和StAX等解析器的对比。 1. **什么是`jsoniter`**: `...

    PyPI 官网下载 | period_iterator-1.2.1-py3-none-any.whl

    在PyPI上,我们发现了`period_iterator-1.2.1-py3-none-any.whl`这个资源,它是Python生态系统中的一个重要组成部分,让我们一起深入了解这个库的功能、用途以及如何在项目中应用。 `period_iterator`是一个专为...

    开源项目-json-iterator-go.zip

    开源项目“json-iterator-go”是一个针对Go语言的高性能JSON解析库,它的设计目标是提供与标准库`encoding/json`完全兼容的接口,同时在性能上有所提升。这个压缩包`json-iterator-go.zip`包含了项目的源代码,具体...

    Iterator与fast-fail机制.pdf

    迭代器(Iterator)是Java集合框架中的核心接口之一,它为遍历各种集合提供了统一的访问方式。在没有迭代器的情况下,我们可以通过for循环来访问集合中的元素,但这种方式需要了解集合的API和内部结构。迭代器的引入...

    Laravel开发-multi-level-array-iterator

    `php-multi-level-array-iterator-master`这个项目很可能包含了完整的实现和示例,你可以下载并研究其代码,以获取更多关于如何在Laravel环境中创建和使用多级数组迭代器的详细信息。 总之,理解并掌握Laravel的...

    Iterator用法

    ### C++中的Iterator模式详解 #### 什么是Iterator模式? 在软件工程中,设计模式是一种用于解决特定问题的通用可重用解决方案。Iterator模式是其中的一种,其主要目标是在不暴露集合内部结构的情况下,为遍历集合...

    Triangular+Triangular-iterator+iterator-overflow.zip

    Triangular类,包含对Triangular类的提领操作Triangular_iterator类,以及异常类iterator_overflow。 输入输出样例为: (3,6) Triangular Series of 6 elements 6 10 15 21 28 36

    前端开源库-async-iterator-all

    5. **与其他库的结合**:`async-iterator-all`可以与其它基于异步迭代器的库,如`stream-to-array`或`async-iterator-to-stream`配合使用,实现更复杂的流操作。 6. **兼容性**:由于`async-iterator-all`依赖于ES6...

    深入解读JavaScript中的Iterator和for-of循环

    JavaScript中的Iterator和for-of循环是ES6(ECMAScript 2015)规范中引入的重要特性。它们为遍历数据结构提供了一种更加简洁、直观且功能强大的方法。在介绍这两个概念之前,我们先来回顾一下传统的遍历方法。 在...

    Iterator.zip

    迭代器(Iterator)是软件设计模式中的一种,它在编程领域中扮演着重要的角色,特别是在处理集合类数据结构时。这个设计模式的核心理念是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这意味着,...

    struts2中iterator 标签的使用详解

    ### Struts2中Iterator标签的深入解析与应用 在Struts2框架中,`&lt;s:iterator&gt;`标签是一个非常强大的工具,用于在JSP页面上循环遍历集合数据,如列表(List)、数组、Map等。它允许开发者以一种动态且灵活的方式展示...

    JAVA中的Iterator的用法

    ### JAVA中的Iterator的用法详解 #### 一、概述 在Java编程语言中,`Iterator`接口扮演着遍历集合的重要角色。它提供了一种方式,使得开发人员能够以一致的方式遍历各种类型的集合,无需了解集合的具体实现细节。...

Global site tag (gtag.js) - Google Analytics