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

时间:2013-11-12 10:18:32

标签: php

我想使用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");
    }

    }

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

class Myclass(){

    private function isPunc($var) {
        if ($var=='.') {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    public function myfunction($arr) {
         $arr = array_filter($arr, array($this,'isPunc'));
    }

}

答案 2 :(得分:0)

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

  1. 具有函数名称
  2. 的字符串
  3. 一个数组,其对象和方法名称为元素
  4. 匿名函数
  5. 一个仿函数(一个实现__invoke的对象)
  6. 在您的情况下,第二个变体应该有效:

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

    在这种情况下,过滤器可以即时运行。它仅在实际访问元素时使用。