【问题标题】:PHP change default iterator using foreach for an objectPHP使用foreach更改对象的默认迭代器
【发布时间】:2015-08-27 16:18:52
【问题描述】:

使用这样的对象:

class test {
var $propa = 'a';
var $propb = 'b';
var $propc = 'c';
var $propd = array(1,2,3,4);
}

如何在没有直接引用的情况下使用 foreach 迭代 test::$propd?情商:

$t = new test;
foreach ($t as $k => $v){
echo 'propd['.$k.']='.$v.', ';
}
// propd[0]=1, propd[1]=2, propd[2]=3, ...

是否有一些涉及实现 ArrayAccess 的东西? 谢谢!

【问题讨论】:

  • 试试这个:echo 'propd['.$k->$propd[$v].']='.$v.', ';
  • 使用 var 是对 PHP4 的倒退,您应该设置 visibility (public/private/protected)

标签: php arrays object foreach


【解决方案1】:

我建议分离功能,并将您的属性设置为私有。

例子:

class Test {

   private $propertyA = 'a';
   private $propertyB = 'b';

   public function getProperties()
   {
        return [
           'propertyA' => $this->propertyA,
           'propertyB' => $this->propertyB
        ];
   }

}

但是,如果要更改属性值,则为属性执行 getter 和 setter。

使用上面的代码你可以做到:

<?php

$test = new Test;
foreach ($test->getProperties() as $key => $value) {
    echo $key . ' = ' . $value;
}

?>

您还可以使用此方法限制要输出的属性。

【讨论】:

  • 是的,我知道,但重点是是否有办法省略 '->getProperties()' 部分并使 foreach 循环直接在数组属性中。
  • 尝试将要循环的属性设置为公开。然后做一个 var_dump 看看你有什么可用的。
  • 范围没问题。我找到了实现 IteratorAggregate 的可能解决方案:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多