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"));
 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容