【问题标题】:"iterate" a single object or the index equivalent of a php object“迭代”单个对象或 php 对象的等效索引
【发布时间】:2012-11-05 19:15:09
【问题描述】:

我可以到达我要去的地方,但我想要最漂亮的路。

让我来到这里的原因是研究运行一个函数的最佳方法,该函数返回一组对象,如 $dom->getElementsByTagName()$pdo->query('SELECT itcher FROM scratches'),然后 - 知道它只会有一个结果 - 访问该结果。

我做了一些研究,但我想知道我知道所有要知道的。

foreach 或任何迭代多个事物的东西从美学的角度来看都是愚蠢的,因为我知道只有一个。将其转换为数组感觉就像一个瑕疵,我想开始我的代码。到目前为止,我最喜欢的是$object->{'0'},因为它与我发现的$object[0] 一样接近,但它似乎并非在所有情况下都有效。有没有更漂亮的东西可以看?例如,foreach($key as $val) 在每次迭代中将 $key 设置为 $val 时到底在做什么?我可以自己做吗?

也许我没有在脑海中正确地想象对象的概念,但是getElementsByTagName 和 mysql 查询返回 arrays 不是更有意义吗?为什么不呢?

【问题讨论】:

  • 我不确定这是否适用,但我一直使用教义的 getSingleResult() 和 getArrayResult() 函数。他们对查询的处理对我来说是个谜
  • 有时对于数据库,您不想一次将整个结果集提取到内存中,这在返回数组时是必需的。 pdo 通过fetchAll() 将其作为一个选项提供。数组还需要调用代码等待所有结果都被获取,而返回一个可迭代对象为调用代码提供了更快开始处理的机会。但是,我认为数组应该是默认的,这些特殊情况的接口应该是选项。

标签: php arrays object


【解决方案1】:

例如,当将 $key 设置为 $val 时,foreach($key as $val) 在每次迭代中究竟做了什么?我可以自己做吗?

如果它真的是一个数组,你可以用reset() 获取第一个元素。

如果它是Iterator(用于允许foreach 访问对象),那么您应该可以使用$object->current();

我从未真正看过 foreach 的底层代码 - 但是 reset()current() 似乎类似于 foreach 在迭代开始时会“做”的事情。

不幸的是,您引用的两个示例是内部类,according to the docs 内部类(属于语言或扩展的类)不遵循相同的规则:

实现此接口的内部(内置)类可用于 foreach 构造,无需实现 IteratorAggregate 或 Iterator。

也就是说,任何返回可以被foreach 迭代的对象的用户类都应该是Traversable 类型(foreach 要求的),所以我相信current() 应该按照您想要的方式工作。请注意,如果对象实际上实现了IteratorAggregate 而不是Iterator,则必须使用getIterator()->current()

但是,仍然可以使用您的两个示例 - 只需使用特定于这些返回类型的方法。对于getElementsByTagName(),您可以使用getElementsByTagName->item(0),对于PDO,您可以使用query()->fetch()

【讨论】:

  • 这让我觉得我对正在发生的事情有了更好的理解。您是说每个编写良好的对象通常都有自己的获取下一个相关项目的方法,对吗?而没有这样做的全局 PHP 方法的原因是因为对象具有独立的需求和存储数据的方法。另外,非常感谢包含 DOM 和 PDO 方法来获取该数据——这让我非常清楚。
  • @StatycAutomatyc 好像大多数对象都应该有办法获取第一项;但是,当您使用内部对象时,您只需要使用对象特定的方法。您应该能够将current() 用于任何库/用户空间代码(即使没有特定于该对象的方法)。
  • 请注意,current() 似乎不适用于 getElementsByTagName,因为它是一个未定义的方法。
  • @StatycAutomatyc 这是正确的,因为记录的 internal 类不需要实现IteratorAggregateIterator(用户级类)。所以你不能指望current()getIterator()->current()internal 类上工作。
  • 哦,对不起,我明白了。起初不知道 internal 在这种情况下是什么意思。再次感谢,伙计。太棒了。
猜你喜欢
  • 2022-12-05
  • 2011-07-23
  • 2020-10-16
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2018-04-01
  • 2021-11-14
相关资源
最近更新 更多