【问题标题】:Is an array an instance of Traversable?数组是 Traversable 的实例吗?
【发布时间】:2016-11-30 09:55:14
【问题描述】:

这是我框架中的基本数组

 array(2) {
  [0]=>
  string(2) "40"
  [1]=>
  string(2) "41"
}

这是我的测试:

echo($array instanceof Traversable); // 0
echo(is_array($array)); // 1

看来我的标准 php 数组不是 Traversable 的实例,这似乎不一致。

【问题讨论】:

  • 数组在 PHP 中没有实现 Traversable,但它们可以在 foreach 中遍历
  • 数组不是类,因此它甚至不能从任何类或接口扩展。 Traversable 适用于迭代器等。
  • 从 PHP 7.1 开始,您可以使用伪类型 iterable 作为类型声明,它允许使用数组或实现 Traversable 的东西:php.net/manual/en/language.types.iterable.php

标签: php


【解决方案1】:

是的,它不是 Traversable。

接口Traversable 的主要目标是使对象可与foreach 一起使用。

【讨论】:

    【解决方案2】:

    无论是否一致,数组只是 php 中的一种原始类型(不是类),因此它不会遵循面向对象的实现接口的风格——在这种情况下是 Traversable 接口。

    然而,PHP 为我们提供了一种将数组转换为对象的好方法,使用 \ArrayObject 其行为几乎就像一个数组(几乎是因为它实际上是一个对象而不是数组):

    $someArray = ['foo' => 'bar'];
    $objectArray = new \ArrayObject($someArray);
    
    // now you can use $objectArray as you would your $someArray:
    
    // access values
    $objectArray['foo']
    
    // add values
    $objectArray['boo'] = 'far';
    
    // foreach it
    foreach ($objectArray as $key => $value) { ... }
    
    // it also implements \Traversable interface!
    $objectArray instanceof \Traversable // true
    

    【讨论】:

      【解决方案3】:
      • php 中的数组是原始类型,原始类型不能继承自 类或实现接口

      • 因此php中的数组类型不是Traversable的实例

      我想作为附加信息添加的是:

      • 该数组和 Traversable 组合形成另一种类型,称为 iterable
      • 换句话说,php 中的iterable 类型是Traversable | array 的并集
      • 像迭代器和生成器这样的接口类型实现了 Traversable,因此属于 iterable 类型
      • 如果您实现一个函数,该函数接受我们想要迭代的参数(使用 foreach)但我们事先不知道它是一个数组还是另一个 iterable 数据结构(如实现Iterator的类)。

      【讨论】:

        猜你喜欢
        • 2017-01-09
        • 2021-04-21
        • 2018-03-02
        • 2016-06-18
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2017-07-05
        • 2023-03-08
        相关资源
        最近更新 更多