變量函數
<?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"));