5.4.9 PHP制作回调函数3

变量函数

<?php
// 声明回调函数filter, 在0-100的整数中通过自定义条件过滤不要的数字
functionfilter($fun){
for($i=0; $i <= 100;$i++) {
//将参数变量$fun加上一个圆插号$fun(), 则为调用和变量$fun值同名的函数
if( $fun($i))
continue;
echo$i.'
';
}
}
//声明一个函数one, 如果参数是3的倍数就返回true, 否则返回false
** function** one($num) {
return$num%3==0;
}
// 声明一个函数two, 如果参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false
** function** two($num) {
return$num==strrev($num);
}
filter("one"); //打印出100以内非3的倍数,参数"one"是函数one()的名称字符串,是一个回调
echo'--------------------
';
filter('two'); //打印出100以内非回文数,参数"two"是函数two()的名称字符串,是一个回调

借助call_user_func_array()函数自定义回调函数


<?php
    /** 声明一个函数fun(), 功能只输出两个字符串,目的是作为call_user_func_array()回调参数
        @param  string  $msg1   需要传递一个字符串作为参数
        @param  string  $msg2   需要传递另一个字符串作为参数
    */
    **function**fun($msg1,$msg2) {
        **echo**'$msg1 = '.$msg1;
        **echo**'<br>';
        **echo**'$msg2 = '.$msg2;
    }
    
    /** 通过系统函数call_user_func_array() 调用函数fun()
        第一个参数为函数fun()的名称字符串
        第二个参数则是一个数组,每个元素值会按顺序传递给调用的fun()函数参数列表中
    */
    call_user_func_array('fun',**array**('LAMP', '兄弟连'));
    

类静态函数和对象的方法回调

<?php
    /* 声明一个类Demo,类中声明一个静态的成员方法fun() */
    **class**Demo {
        **static****function**fun($msg1,$msg2) {
            **echo**'$msg1 = '.$msg1;
            **echo**'<br>';
            **echo**'$msg2 = '.$msg2;
        }
    }
    /* 声明一个类Test, 类中声明一个普通的成员方法fun()  */
    **class**Test {
        **function**fun($msg1,$msg2) {
            **echo**'$msg1 = '.$msg1;
            **echo**'<br>';
            **echo**'$msg2 = '.$msg2;
        }
    }
    
call_user_func_array(**array**("Demo", 'fun'),**array**('LAMP', '兄弟连') );
call_user_func_array(**array**(**new**Test(),'fun'), **array**('BroPHP','学习型PHP框架') );

例test.php

<?php
    error_reporting(0);
/*
 *  在使用一个函数的时候, 如果传一个变量, 不能解决多大的问题, 就需要将一个过程进入到函数中, 改变函数的执行行为.
 *
 *  在函数的调用时, 在参数中传的不是一个变量或一个值, 而是一个函数, 这就是回调函数参数
 *
 *  制作回调函数
 *
 */

/*
    function fun($one="1", $two="2", $three="3") {
        echo "$one--------$two-------------$three<br>";
    }

    //参数个数如果是变长时, 就不能直接调用这个函数

    call_user_func_array("fun", array(111, 222, 333333));
 */

    function demo($num, $n) {
        // $n = "test";

        for($i=0; $i<$num; $i++) {
            // if($n($i))
            if(call_user_func_array($n, array($i)))
                continue;
            echo $i."<br>";
        }
    }
    class Filter {
        function one($i) {
            if($i%3==0) {
                return true;
            }else{
                return false;
            }
        }
        static function two($i) {
            if(preg_match('/3/', $i)) {
                return true;
            }else{
                return false;
            }   
        }
    }
/*
    $filter = new Filter();
    $filter->one();
    Filter::two();
 */
    function test($i) {
        if($i==strrev($i))
            return true;
        else 
            return false;
    }
//  demo(500, "test");
    demo(500, array(new Filter(), "one"));
//  demo(500, array("Filter", "two"));
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容