1. 程式人生 > >PHP回撥過濾器及回撥函式寫法

PHP回撥過濾器及回撥函式寫法

名稱 id 說明 選項options
回撥過濾器(callback) 1024 呼叫自定義函式來過濾資料 callable函式或方法

回撥函式實現

回撥函式必須接受一個待過濾的值,並返回過濾後的值,回撥函式有四種實現方式。

第一種是直接定義回撥函式,並在使用過濾器函式時,將回調過濾器的options設定為自定義的回撥函式。

<?php
function trimString($value){
    return trim($value);
}
$args=array(
    'options'=>'trimString',
);
var_dump(filter_var('abc ',FILTER_CALLBACK,$args));
?>

 第二種是在使用過濾器函式時,將回調過濾器的options直接設定為回撥函式。

<?php
$args=array(
    'options'=>function ($value){return trim($value);},
);
var_dump(filter_var('abc ',FILTER_CALLBACK,$args));
?>

第三種是通過閉包實現呼叫回撥函式來傳遞其他引數。

<?php
function trimString($array){
    return function($value = null) use ($array){
        if(key_exists('character_mask',$array)){
            return trim($value,$array['character_mask']);  
        }
        return trim($value);
    };
}
$args=array(
    'options'=>trimString(array("character_mask"=>'a..c ')),
);
var_dump(filter_var('abcd ',FILTER_CALLBACK,$args));
?>

第四種是使用類中的函式作為回撥函式,可以用來將多個過濾器回撥函式集中到一起。

<?php
class TrimFilter{
    private $options=array();
    private $defaults=array('character_mask'=>" \t\n\r\0\x0B");
    public function __construct(array $options=array()){
        $this->options = $options;
    }
    
    private function get_options(array $defaults){
        return array_merge($defaults, $this->options);
    }
    
    function trimString($value){
        $ops=$this->get_options($this->defaults);
        if(key_exists('character_mask',$ops)){
            return trim($value,$ops['character_mask']);  
        }
        return trim($value);
    }
    
    function ltrimString($value){
        $ops=$this->get_options($this->defaults);
        if(key_exists('character_mask',$ops)){
            return ltrim($value,$ops['character_mask']);  
        }
        return ltrim($value);
    }
    
    function rtrimString($value){
        $ops=$this->get_options($this->defaults);
        if(key_exists('character_mask',$ops)){
            return rtrim($value,$ops['character_mask']);  
        }
         return rtrim($value);
    }
    
}

$trim_args=array(
    'options'=>array(
        new TrimFilter(array('character_mask'=>" a")),TRIMSTRING
    )
);
$ltrim_args=array(
    'options'=>array(
        new TrimFilter(array('character_mask'=>" a")),LTRIMSTRING
    )
);
$rtrim_args=array(
    'options'=>array(
        new TrimFilter(),RTRIMSTRING
    )
);
$str="abcd ";
var_dump(filter_var($str,FILTER_CALLBACK,$trim_args));
var_dump(trim($str," a"));
var_dump(filter_var($str,FILTER_CALLBACK,$ltrim_args));
var_dump(ltrim($str," a"));
var_dump(filter_var($str,FILTER_CALLBACK,$rtrim_args));
var_dump(ltrim($str));
?>