如何在 PHP 类中调用回调函数


How to call a callback function in a PHP class

我想使用 array_filter 删除数组中值等于特定字符(如 '." )的那些项目。为此,所以我使用了以下代码,但我不知道如何将回调函数传递给array_filter:

    class Myclass(){
            private function isPunc($var){
        if($var=='.'){
            return TRUE;
        }else{
            return FALSE;
        }
        public function myfunction($arr){
         $arr = array_filter($arr,"isPunc");
    }
    }

知道如何解决这个问题吗?

class Myclass(){
    private function isPunc($var) {
        if ($var=='.') {
            return TRUE;
        } else {
            return FALSE;
        }
    }
    public function myfunction($arr) {
         $arr = array_filter($arr, array($this,'isPunc'));
    }
}

使用$arr = array_filter($arr, array($this, 'isPunc'));

array_filter() 需要一个可调用的。这是 PHP 中一种特殊的内部类型,可以包含以下四项:

  1. 具有函数名称的字符串
  2. 以对象和方法名称作为元素的数组
  3. 匿名函数
  4. 函子(实现__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));

在这种情况下,过滤器会动态工作。仅当实际访问元素时才使用它。