在php5中,更是发扬了Array,php内置了一些类和接口,
允许你创建你自己的数据结构。Magento充分利用了这一点,
在使用Varien_Data_Collection来做数据收集的时候,
它实现了php内置IteratorAggregate对象迭代器和Countable两个接口。
下面是用php内置类ArrayObject的一个例子。
$array=new ArrayObject(); class Mycollection extends ArrayObject{} $collection=new Mycollection(); $collection[]='bar'; var_dump($collection); //object(Mycollection)#2 (1) { ["storage":"ArrayObject":private]=> array(1) { [0]=> string(3) "bar" } }
<?php /* * Created by PhpStorm. * User:ajiang-tuzhi * QQ:1050653098@qq.com * WebSite:www.weicot.com * Date: 2015/11/11 * Time: 10:25 */ class Aps_Weicot_thingController extends Mage_Core_Controller_Front_Action{ public function indexAction() { $thing_1 = new Varien_Object(); /*创建一个数据收集器</H4< p> 首先,我们创造一些新的对象。*/ $thing_1->setName('jiang'); $thing_1->setAge('20'); $thing_2 = new Varien_Object(); $thing_2->setName('ajiang'); $thing_2->setAge('21'); $thing_2->setLastName('tuzhi'); /* Magento中所有的Model都继承Varien_Object, 在面向对象编程中,这样做的好处是当你想往多个Model中添加方法的时候, 你只需要简单地修改一个文件即可。 在继承Varien_Object的类中,有两个魔术方法,get/set, 你可以很方便的向对象中加入一个属性(值), 让我们看个例子。*/ //var_dump($thing_2->getName()); //var_dump($thing_1->getData()); //string(6) "ajiang" array(2) { ["name"]=> string(5) "jiang" ["age"]=> string(2) "20" } /* 这个归功于php5的新特性,ArrayAccess接口。 也是 “Object Oriented Programming”. 现在然我们把这些对象加到数据收集器Varien_Data_Collection中。 很多程序员将Collection看成是数组, 当然我不反对。*/ $collection_of_things=new Varien_Data_Collection(); $collection_of_things ->addItem($thing_1) ->addItem($thing_2); /*大多数Magento data Collections继承于Varien_Data_Collection,你可以使用里面的任何一个方法。 那么我们可以做些什么呢?接下来我们使用foreach去循环它。*/ foreach($collection_of_things as $thing){ // var_dump($thing->getData()); } //array(2) { // ["name"]=> string(5) "jiang" // ["age"]=> string(2) "20" } // array(3) { // ["name"]=> string(6) "ajiang" // ["age"]=> string(2) "21" // ["last_name"]=> string(5) "tuzhi" } // var_dump($collection_of_things->getFirstItem()); //获取第一个数据 和最后一个数据 //object(Varien_Object)#74 (7) { // ["_data":protected]=> array(2) { ["name"]=> string(5) "jiang" ["age"]=> string(2) "20" } // ["_hasDataChanges":protected]=> bool(true) // ["_origData":protected]=> NULL // ["_idFieldName":protected]=> NULL // ["_isDeleted":protected]=> bool(false) // ["_oldFieldsMap":protected]=> array(0) { } // ["_syncFieldsMap":protected]=> array(0) { } } $collection_of_things->getLastItem()->getData();//h获取最后一个数据 //array(3) { ["name"]=> string(6) "ajiang" ["age"]=> string(2) "21" ["last_name"]=> string(5) "tuzhi" } var_dump($collection_of_things->toXml());//输出为xml /* <?xml version="1.0" encoding="UTF-8"?> <collection> <totalRecords></totalRecords> <items><item> <name><![CDATA[jiang]]></name> <age><![CDATA[20]]></age> </item> <item> <name><![CDATA[ajiang]]></name> <age><![CDATA[21]]></age> <last_name><![CDATA[tuzhi]]></last_name> </item> </items> </collection>"*/ //只取某一段的值 //var_dump($collection_of_things->getColumnValues('name')); //array(2) { [0]=> string(5) "jiang" [1]=> string(6) "ajiang" } //基本的过滤功能 var_dump($collection_of_things->getItemByColumnValue('name','ajiang')); //string(335) " " object(Varien_Object)#28 (7) { // ["_data":protected]=> array(3) { // ["name"]=> string(6) "ajiang" // ["age"]=> string(2) "21" // ["last_name"]=> string(5) "tuzhi" } // ["_hasDataChanges":protected]=> bool(true) // ["_origData":protected]=> NULL // ["_idFieldName":protected]=> NULL // ["_isDeleted":protected]=> bool(false) // ["_oldFieldsMap":protected]=> array(0) { } // ["_syncFieldsMap":protected]=> array(0) { } } /*模型数据收集器(Model Collections) 前面我们有提到,所有Magento的模型数据收集器都继承Varien_Data_Collectionm, 所以理论上我们可以使用之前的所有方法。 下面让我们以product模型实战下。*/ } }