PHP Traversable类型提示

时间:2013-06-10 19:53:23

标签: php arrays php-7.1

我有一个使用foreach

的相对简单的函数
function foo($t) {
     $result;
     foreach($t as $val) {
         $result = dosomething($result, $val);
     }
     return $result;
}

我想输入提示,Traversable似乎是我需要的确切类型提示

 function foo(Traversable $t) {

然而,当使用数组时,这会产生E_RECOVERABLE_ERROR(当然可以在foreach中使用):example

 Argument 1 passed to foo() must implement interface Traversable, array given

有没有办法输入提示或这是不可能的?

3 个答案:

答案 0 :(得分:8)

有一个错误:#41942。关闭为'不是错误'。由于PHP数组不是对象,因此无法实现接口,因此无法同时键入提示arrayTraversable

您可以使用iterator_to_arrayArrayIterator或省略类型提示。请注意,iterator_to_array会将整个迭代器复制到一个数组中,因此可能效率低下。

// These functions are functionally equivalent but do not all accept the same arguments
function foo(array $a) { foobar($a); }
function bar(Traversable $a) { foobar($a); }
function foobar($a) {
    foreach($a as $key => $value) {
    }
}

$array = array(1,2,3)
$traversable = new MyTraversableObject();

foo($array);
foo(iterator_to_array($traversable));

bar(new ArrayIterator($array));
bar($traversable);

foobar($array);
foobar($traversable);

答案 1 :(得分:3)

同样的问题。我放弃了,我只需手动编写函数中的所有内容。

这应该为您提供所需的功能:

function MyFunction($traversable)
{
    if(!$traversable instanceof Traversable && !is_array($traversable))
    {
        throw new InvalidArgumentException(sprintf(
            'Myfunction($traversable = %s): Invalid argument $traversable.'
            ,var_export($traversable, true)
       ));
    }
}

修改

如果您只想显示$traversable的类型。如果您希望在子类中继承该功能。

public function MyMethod($traversable)
{
    if(!$traversable instanceof Traversable && !is_array($traversable))
    {
        throw new InvalidArgumentException(sprintf(
            '%s::MyMethod($traversable): Invalid argument $traversable of type `%s`.'
            ,get_class($this)
            ,gettype($traversable)
       ));
    }
}

答案 2 :(得分:2)

问题是,数组不是对象,因此它们无法实现接口。因此,您无法同时输入提示arrayTraversable