dongxieyou3314 2011-11-22 10:27
浏览 28
已采纳

在PHP中实现类似.Net的集合

So, i would like to implement something like this:

class Collection{
   private $array;
   public function add($object){
      array_push($this->array, $object);
   }
   public function array(){
      return $this->array;
   }
}
class JustaClass{
   public $myCollection;
   public function __construct(){
      $this->myCollection = new Collection();
   }
}

$justAnObject = new JustaClass();
$justAnObject->myCollection->add(new SomeObject());

this works just fine, but i would like to work with it like i do in .Net, ie, when i want to refer to the collection Object, i would like to do it directly, like:

foreach($justAnObject->myCollection as $collectionItem)

and not like

foreach($justAnObject->myCollection->array() as $collectionItem)

Is there any way I can do this? maybe a magic method, or implementing an Iiterator-like interface?

thanks

  • 写回答

2条回答 默认 最新

  • douyinzha5820 2011-11-22 10:33
    关注

    Let your Collection class implement the Iterator or IteratorAggregate interfaces. There's also an ArrayIterator class, so it's really as easy as just returning an instance of that class:

    class Collection implements IteratorAggregate {
      private $array;
      public function add($object){
        array_push($this->array, $object);
      }
    
      /* required by IteratorAggregate */
      public function getIterator() {
        return new ArrayIterator($this->array);
      }
    }
    

    You can then use your class in the following way:

    $c = new Collection();
    $c->add(1);
    $c->add(2);
    $c->add('we can even add strings');
    foreach($c as $v) {
      doSomething($v);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向