空间访问权限:游客, 头像访问权限:自己
[登录]后可以浏览更多信息
博客正文
【操作】
PHP回调函数

一、预备知识
 
1、把匿名函数赋给变量,利用变量调用函数
 $fun = function($a,$b){  //注意,这里的函数必须是匿名的
      echo "{$a}, {$b}!";
 };                       //注意,这里的分号不可少
 $fun('hello', 'world');  //调用

2、用USE关键字引用父作用域中的变量
 $c='2019';
 $d='03';
 $fun=function($a,$b){
      echo "{$a}, {$b}! {$c}{$d}";
 };
 $fun('hello', 'world');

上面的代码回出错,在匿名函数里无法直接调用父对象域定义的变量$c,$d,必须用use关键字,改成下面的代码即可
 $fun=function($a,$b) use($c, $d){
      echo "{$a}, {$b}! {$c}{$d}";
 };
注意,use里的变量如果在父作用域里没有定义,也会出错。


3、用call_user_func_array调用预定义函数
call_user_func_array第一个参数为函数名,第二个参数为函数参数,以数组形式传入
 function debug($a, $b){
      echo "{$a}, {$b}!";
 }
 call_user_func_array('debug', array("hello", "world"));

4、用create_function创建匿名函数,再array_walk调用并传入参数
 $av = array("the ", "a ", "that ", "this ");
 $fun = create_function('&$v, $k', '$v = $k . "," . $v . "mango";');
 array_walk($av, $fun);
 print_r($av);

注意 array_walk把数组$av作为参数传给$fun指向的匿名函数,第1个参数$v为数组中元素的值,第2个参数$k为元素的键

运行结果为
Array
(
    [0] => 0,the mango
    [1] => 1,a mango
    [2] => 2,that mango
    [3] => 3,this mango
)

省掉$fun 变量也可以
 $av = array("the ", "a ", "that ", "this ");
 array_walk($av, create_function('&$v, $k', '$v = $k . "," . $v . "mango";'));
 print_r($av);

二、应用

    我有个两个互不干扰的独立的类fiewView和Prermission,这样做的目的是更精简便于代码分离

  • fiewView类:从数据库读取文件名、扩展名,缩略图,转成xml发送给js
  • Prermission类:根据用户的UID和GID跟文件或文件夹的权限设置、文件的UID、文件的状态(只读锁定,隐藏,删除)进行权限运算,返回检测成功和失败的条目。

       我一直用着2个类进行独立运作,以实现获取数据->权限检测-> 输出数据的流程,最初的解决办法是,fiewView获取常规字段,Prermission获取权限字段,二者再求交集,符合条件的让fiewView输出为XML。现在利用回掉技术,只要读一次数据库,定义一个方法就能实现了。

    整改过程如下:

    第1步、修改fiewView 的filesGet方法。增加回掉函数参数$callbackfun_chekPerm
    public function filesGet($fatherid, $callbackfun_chekPerm, ...){
        根据 $fatherid读取条目常规字段和权限字段等信息,存入$_info

        $_exclude = $callbackfun_chekPerm($_info,$permval);//利用回调函数进行权限检测,把不符合条件条目的存入$_exclude

         foreach($_info as $_iteminfo){
              排除$_exclude的条目
              生成xml发送给js
         }
    }

    第2步、定义回调函数$callbackFunChkPerm

    • $pms是Prermission类的实例化
    • $permval是要检测的权限类型,包括列出、下载、删除、上传、管理……

    snap1.jpg

    snap2.jpg

    $callbackFunChkPerm = function($_info, $permval=PERM_VISIT) use($pms, $quid, $_qgid){
         return $pms->chkPermByInfoArray($_info, $type, $permval, $quid, $_qgid);
    }

    第3步、把$callbackFunChkPerm作为参数传递给fiewView->filesGet
    $fv->filesGet($fatherid, $callbackFunChkPerm, ……);

  • 栏目划分
    WEB应用程序 (29)
    桌面应用程序 (9)
    Windows操作系统 (12)
    xNix操作系统 (5)
    数据库技术 (3)
    多媒体技术 (1)
    硬件技术 (4)
    办公软件 (2)
    以史为鉴 (2)
    教学反思1 (2)
    奇闻趣事 (5)
    其它 (11)
    教学反思 (4)
    电子技术 (2)
    中学生科技 (3)
     
    主人推荐
    音象定位和音箱喇叭的排步
    我国高层意向已定:制造大飞机
    “运十”悲剧
    日尔曼人
    细说百越族
    宇宙深处的秘密——星云
    [强烈推荐]中华56民族FLASH完整珍藏版
    一组漂亮的植物
      
    桦川县| 西盟| 扶沟县| 桐乡市| 清河县| 兴业县| 邹城市| 沙雅县| 和龙市| 安阳县| 綦江县| 福贡县| 澳门| 兖州市| 沐川县| 乡城县| 洛隆县| 蒲城县| 镇巴县| 临高县| 大新县| 岑溪市| 淮滨县| 阿拉善左旗| 报价| 遵义县| 滨州市| 宁夏| 台南市| 县级市| 新沂市| 凤庆县| 松江区| 宜良县| 永嘉县| 修文县| 江城| 广丰县| 平武县| 奇台县| 哈巴河县| http:// http:// http:// http:// http:// http://