PHP 回调函数的一些疑问

2015-05-21 08:59:09 +08:00
 zencoding
昨天晚上被一个朋友问懵了, 是关于PHP中的call_user_func_array的疑问
假如当前任务线程已执行到最后,下一步通过执行回调,那么在回调函数执行过程中,当前任务线程是什么状态?

等待回调函数执行完成后释放,还是直接释放?
4425 次点击
所在节点    PHP
21 条回复
lincanbin
2015-05-21 09:12:01 +08:00
实际上是同步的
jadecoder
2015-05-21 09:22:03 +08:00
call_user_func_array应该是同步的,不知道为什么会叫回调函数
mcfog
2015-05-21 09:25:00 +08:00
"异步"和“回调”是不一样的两个概念
solupro
2015-05-21 09:30:25 +08:00
@jadecoder callback并不是一定要异步
cevincheung
2015-05-21 09:31:40 +08:00
因为进行了回调所以叫回调函数?
cyanhu
2015-05-21 09:32:38 +08:00
好高深啊
walleL
2015-05-21 09:43:19 +08:00
call_user_func_array() 调用用户函数

我觉得
call_user_func_array("func", array($arg1, $arg2)) 跟 func($arg1, $arg2)
是没区别的, 只是前者允许你动态指定 func
jadecoder
2015-05-21 09:48:49 +08:00
@solupro 第一句话是解释题主的问题,第二句是我自己的疑问。明白人麻烦解释下为什么这个叫回调函数呗
lincanbin
2015-05-21 10:11:40 +08:00
@jadecoder 把一个function作用到一个数组上,相当于精简版的eval,这样作用,也是callback的一种。
你搞混了回调和异步的关系了。
Septembers
2015-05-21 10:13:36 +08:00
@walleL
$callback_function_name='func';
$callback_function_name($args1, $args1, $args1);
这样写也是可以的
akstrom
2015-05-21 10:14:25 +08:00
$funname($arg1, $arg2) 也是可以的阿
solupro
2015-05-21 10:38:31 +08:00
@jadecoder 我的理解是能被作为参数传递
wavingclear
2015-05-21 11:43:43 +08:00
@jadecoder 我的理解 call_user_func_array 是给用户自定义函数实现回调的一个基础设施
jiongjionger
2015-05-21 11:46:44 +08:00
同步执行,非异步
anewg
2015-05-21 12:36:18 +08:00
@jadecoder http://zh.wikipedia.org/wiki/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0 右边的图。区别在于调用者的不同,非必须异步。
jadecoder
2015-05-21 15:27:48 +08:00
@lincanbin @anewg
我从来没把回调和异步搞混,如果你能解释清楚为什么call_user_func_array被称作回调函数就好好解释一下。
我认同@wavingclear 说的call_user_func_array是实现回调的基础设施。但是这不是call_user_func_array被称作回调函数的理由,eval也可以是实现回调的基础设施,但是eval就没有被称作回调函数。
http://php.net/manual/en/function.eval.php
lincanbin
2015-05-21 15:41:24 +08:00
@jadecoder 回调是eval功能的一个很小的子集,那么eval怎么可能被称为回调?
另外,call_user_func_array的作用是调用一个函数作用到输入的一个array上,根据回调的定义,这就是回调啊。
solupro
2015-05-21 15:55:02 +08:00
@jadecoder
@lincanbin
我觉得是不是大家议论的方向不一样
call_user_func_array 一般情况并不会作为回调函数,这里说的回调函数是指它的第一个参数
mixed call_user_func_array ( callable $callback , array $param_arr )
call_user_func_array — Call a callback with an array of parameters

当然你也不是不能把 call_user_func_array 作为回调函数使用,比如
call_user_func_array('call_user_func_array', [function () {
echo 'foobar';
}, []]);
lincanbin
2015-05-21 16:00:45 +08:00
@solupro 你说得这个,是lambda,lambda和callback也并不是对等关系。
solupro
2015-05-21 16:13:32 +08:00
@lincanbin 嗯,确实是这样。
不过我上面那例子是说明 call_user_func_array 作为回调函数的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/192616

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX