8

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

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

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

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

getElementsByTagName也许我没有在脑海中正确地想象一个对象的想法,但是对于mysql 查询返回数组不是更有意义吗?他们为什么不呢?

4

1 回答 1

3

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

如果它真的是一个数组,你可以用reset().

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

我从来没有真正看过底层代码foreach- 然而reset()current()似乎类似于foreach在迭代开始时会“做什么”。

不幸的是,您引用的两个示例是内部类,并且根据文档内部类(属于语言或扩展的类)不遵循相同的规则:

实现此接口的内部(内置)类可以在 foreach 构造中使用,不需要实现 IteratorAggregate 或 Iterator。

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

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

于 2012-11-17T04:27:25.267 回答