array_filter() 需要一个 Callable。这是 PHP 中的一种特殊内部类型,它可以是以下四种情况:
- 带有函数名的字符串
- 以对象和方法名称为元素的数组
- 匿名函数
- 仿函数(实现 __invoke 的对象)
在您的情况下,第二个变体应该可以工作:
class FilterIsDot {
private function accept($element) {
if($element == '.'){
return TRUE;
}else{
return FALSE;
}
}
public function filter($array) {
return array_filter(
$array, array($this, 'accept')
);
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot();
var_dump($filter->filter($in));
我会建议一种不同的方法来避免 array_filter()。SPL 包含一个 FilterIterator 类。你可以扩展这个类:
class FilterIsDot extends FilterIterator {
public function __construct($arrayOrIterator) {
parent::__construct(
is_array($arrayOrIterator)
? new ArrayIterator($arrayOrIterator)
: $arrayOrIterator
);
}
public function accept() {
if($this->current() == '.') {
return TRUE;
}else{
return FALSE;
}
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot($in);
var_dump(iterator_to_array($filter));
在这种情况下,过滤器即时工作。它仅在实际访问元素时使用。