我有一个使用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
有没有办法输入提示或这是不可能的?
答案 0 :(得分:8)
有一个错误:#41942。关闭为'不是错误'。由于PHP数组不是对象,因此无法实现接口,因此无法同时键入提示array
和Traversable
。
您可以使用iterator_to_array
,ArrayIterator
或省略类型提示。请注意,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)
问题是,数组不是对象,因此它们无法实现接口。因此,您无法同时输入提示array
和Traversable
。