php函数高级部分【回调函数】

回调函数

在使用一个函数的时候, 如果传一个变量, 不能解决多大的问题, 就需要将一个过程进入到函数中, 改变函数的执行行为.在函数的调用时, 在参数中传的不是一个变量或一个值, 而是一个函数, 这就是回调函数参数

回调函数格式说明:
 mixed funName(callback arg) 
所谓回调函数,就是指调用函数时并不是传递一个标准的变量作为参数,而是将另一函数作为参数传递到调用的函数中。
1.变量函数
2.使用变量函数声明和应用的回调函数
3.借助call_user_func_array()函数自定义回调函数
4.类静态函数和对象的方法回调
e.g.排序 类似于c++的cmp函数的写法 貌似usort()是内置函数吧
<?php
	$arr=array("aaa","aaaaa","a","aaaaaaaaa","ddddddd");
	function mycom($a,$b){
		if(strlen($a)>strlen($b)) return 1;
		else if(strlen($a)<strlen($b)) return -1;
		else return 0;
	}
	print_r($arr);
	usort($arr,"mycom");
	echo '<br>';
	print_r($arr);

输出结果:
Array ( [0] => aaa [1] => aaaaa [2] => a [3] => aaaaaaaaa [4] => ddddddd ) 
Array ( [0] => a [1] => aaa [2] => aaaaa [3] => ddddddd [4] => aaaaaaaaa )


再来一个输出回文数字的
<?php
	function demo($num,$n){
		for($i=0;$i<$num;$i++){
			if($n($i)==false) continue;
			echo $i."    ";
		}
	}
	function test($i){
		if($i==strrev($i)) return true;//strrev()判断是否是会回文串的
		else return false;
	}
	demo(500,"test");
输出:
0 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 101 111 121 131 141 151 161 171 181 191 202 212 222 232 242 252 262 272 282 292 303 313 323 333 343 353 363 373 383 393 404 414 424 434 444 454 464 474 484 494

综合起来就是:
<?php
	function filter($fun){
		for($i=0;$i<=100;$i++){
			if($fun($i)) continue;
		echo $i."  ";
		}
	}
	function one($num){
		return $num%3==0;
	}
	function two($num){//拼写啊!function 少写了c 查错了半天才发现
		return $num==strrev($num);
	}
	filter("one");
	echo '-----------<br>';
	filter("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', '兄弟连'));
输出:
$msg1 = LAMP
$msg2 = 兄弟连

所以上面的例子可以这么写:
<?php
	function demo($num,$n){
		for($i=0;$i<$num;$i++){
			if(call_user_func_array($n,array($i))) continue;//array不是$array 
			echo $i."   ";
		}
	}
	function test($i){
		if($i==strrev($i))return true;
		else return false;
	}
	demo(500,"test");

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

<?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框架') );

输出:
$msg1 = LAMP
$msg2 = 兄弟连$msg1 = BroPHP
$msg2 = 学习型PHP框架

<?php
	function demo($num,$n){
		for($i=0;$i<$num;$i++){//时刻记得在php中每个变量前面都要加$
			if(call_back_func_array($n,array($i))) continue;
			echo $i."   ";
		}
	}
	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;
			}	
		}
	
	}
	$fil=new filter();
	$fil->one();
	filter::two();
这段代码是不是看起来特别顺眼~~然而执行之后是酱婶儿的┗( T﹏T )┛

因为类静态函数和对象的方法回调就不是让你那么用的哈哈哈哈
正确的写法:
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"));
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值