关于call_user_func( ) 和 $_session的疑惑

懒洋洋heart33 2014-11-27 07:10:05
下面是1.php的部分代码

class A
{
var $afterEditFun;
function editRow()
{
//.......
if($result)
{
if(!empty($this->afterEditFun) && is_callable($this->afterEditFun))
{
call_user_func($this->afterEditFun,$idArr,$this->primaryKeyCol,$afterEditArray);
}
}

}

function setConfig($var,$value) //e.g. $var=afterEditFun, $value=array(&$this,'sendNotice')
{
if($var == 'varPrefix') //varPrefix=id-tablename
{
// If the variable prefix changed, update variables with session values
$varPrefix = $value;
foreach($_SESSION as $sessKey => $sessValue)
{
if(substr($sessKey,0,strlen($varPrefix)) == $varPrefix)
{
$varName = str_replace($varPrefix,'',$sessKey);
$this->{$varName} = $sessValue;
}
}
}
if(!isset($_SESSION[$this->varPrefix.$var])) //$_SESSION[id-tablename.afterEditFun]
{
$this->{$var} = $value; //$this->{afterEditFun} = array(&$this,'sendNotice')
}
}
}


下面是2.php

require_once('php/A.php');
function ()
{
//........
$Editor = new A( );
$Editor->setConfig('afterEditFun',array(&$this,'sendNotice'));
//.........
}
funciton sendNotic()
{
//..............
}


非常疑惑。。在1.php调用call_user_func($this->afterEditFun,$idArr,$this->primaryKeyCol,$afterEditArray); 搜了下afterEditFun除了在成员变量声明外,1.php其他地方都没有。
在2.php调用了1.php的setConfig()方法,关于这个方法不是太明白。。能有人讲解一下吗??
...全文
435 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒洋洋heart33 2014-11-28
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
call_user_func 函数原型 mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) 参数由 $callback 回调函数和参数列表做成 比如 function f($a, $b, $c) { } call_user_func('a', 1, 2, 3); 就相当于执行 f(1, 2, 3); 由于回调函数是以变量形式出现的 所以 call_user_func 可以动态执行各种函数(只要参数正确)而无需改变程序本身 回调函数可以有以下形式 1、已定义函数:函数名 2、对象的方法:array(对象名, 方法名),array(类名, 方法名) 3、动态创建的函数:create_function(...) 4、闭包:function(...) 在实际开发中,call_user_func 这个函数没有 call_user_func_array 使用频度高 因为开列参数灵活性较差
谢谢你的回答,这部分明白了些。另外: 1.在$afterEditFun回调之前赋值了某个函数的名字,使用了setconfig。这里面对session进行判断,不是太明白。能解答下吗? 2. 赋值的语法。比如$this->{$var} = $value; 不是太懂。首先$this->{$var} 有“{}”是什么意思。。还有value是一个数组array (&$this,'sendNotic'),是怎么赋值的呢? 谢谢
懒洋洋heart33 2014-11-28
  • 打赏
  • 举报
回复
引用 1 楼 whg4585 的回复:
1、$this->afterEditFun 这个成员变量 在用之前赋值了类中的某个函数的名字;它是在2.php中用 $Editor->setConfig('afterEditFun',array(&$this,'sendNotice'));时行赋值的;是当前对象的sendNotice方法,这样 call_user_func()就是调用了sendNotice方法。 2、setConfig()方法就是根据session的状态动态添加成员变量
您好,我想问问 1.为什么要通过判断session 的状态来给afterEditFun 赋值呢? session里面有个作用,就是可以跨页面传递参数。。但是这里我还是不大明白。afterEditFun这个函数功能是编辑该页面内容,后显示编辑后的有关Notice 2. 在2.php中想调用1.php的方法,可以通过new A() 将1.php对象实例化来调用。。如果2.php也是一个对象比如class B,那么1.php要想调用2.php的方法,是不是不可以new B(), 这个问题比较白痴,感觉就是不可以。那么除了通过回调函数1.php还有其他办法调用2.php的函数吗? 2. $this->afterEditFun 这个成员变量用setConfig赋值时,比如$this->{$var} = $value; 这个语法不是太懂。首先$this->{$var} 有“{}”是什么意思。。还有value是一个数组array (&$this,'sendNotic'),是怎么赋值的呢? 谢谢呢
xuzuning 2014-11-28
  • 打赏
  • 举报
回复
call_user_func 函数原型 mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) 参数由 $callback 回调函数和参数列表做成 比如 function f($a, $b, $c) { } call_user_func('a', 1, 2, 3); 就相当于执行 f(1, 2, 3); 由于回调函数是以变量形式出现的 所以 call_user_func 可以动态执行各种函数(只要参数正确)而无需改变程序本身 回调函数可以有以下形式 1、已定义函数:函数名 2、对象的方法:array(对象名, 方法名),array(类名, 方法名) 3、动态创建的函数:create_function(...) 4、闭包:function(...) 在实际开发中,call_user_func 这个函数没有 call_user_func_array 使用频度高 因为开列参数灵活性较差
小在在 2014-11-28
  • 打赏
  • 举报
回复
1、$this->afterEditFun 这个成员变量 在用之前赋值了类中的某个函数的名字;它是在2.php中用 $Editor->setConfig('afterEditFun',array(&$this,'sendNotice'));时行赋值的;是当前对象的sendNotice方法,这样 call_user_func()就是调用了sendNotice方法。 2、setConfig()方法就是根据session的状态动态添加成员变量
xuzuning 2014-11-28
  • 打赏
  • 举报
回复
先声明一下,你的代码片段是 php4 的,很多写法已经过时了 你也不能指望十年前的人能写出符合现代潮流的代码,如果作者重写他的这个项目的话,水平将大大提高 $this->{$var} = $value; 就是 $this->$var = $value; 是变量的变量,这一点你应该是很清楚的 $a = 1; $b = 'a'; echo $$b; // 输出 1 $a = array(1,2); print_r($a); // 输出 Array ([0] =>1 [1] => 2) 至于为什么要判断 session,那就与业务逻辑用关系了。仅从代码上是看不出来的

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧