繁体   English   中英

PHP Traversable类型提示

[英]PHP Traversable type hint

我有一个使用foreach的相对简单的功能

function foo($t) {
     $result;
     foreach($t as $val) {
         $result = dosomething($result, $val);
     }
     return $result;
}

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

 function foo(Traversable $t) {

但是,这在使用数组时会给出E_RECOVERABLE_ERROR (当然可以在foreach ): 示例

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

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

PHP 7.1为此目的引入了iterable类型声明 ,它接受了\\Traversable数组和实例。

在以前的版本中,您必须省略类型声明。

有一个错误: #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);

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

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

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)
       ));
    }
}

问题是,数组不是对象,因此它们无法实现接口。 所以你不能输入提示, arrayTraversable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM