V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zencoding
V2EX  ›  PHP

PHP 回调函数的一些疑问

  •  
  •   zencoding · 2015-05-21 08:59:09 +08:00 · 4332 次点击
    这是一个创建于 3270 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天晚上被一个朋友问懵了, 是关于PHP中的call_user_func_array的疑问
    假如当前任务线程已执行到最后,下一步通过执行回调,那么在回调函数执行过程中,当前任务线程是什么状态?

    等待回调函数执行完成后释放,还是直接释放?
    21 条回复    2015-05-21 17:33:26 +08:00
    lincanbin
        1
    lincanbin  
       2015-05-21 09:12:01 +08:00 via Android
    实际上是同步的
    jadecoder
        2
    jadecoder  
       2015-05-21 09:22:03 +08:00
    call_user_func_array应该是同步的,不知道为什么会叫回调函数
    mcfog
        3
    mcfog  
       2015-05-21 09:25:00 +08:00
    "异步"和“回调”是不一样的两个概念
    solupro
        4
    solupro  
       2015-05-21 09:30:25 +08:00
    @jadecoder callback并不是一定要异步
    cevincheung
        5
    cevincheung  
       2015-05-21 09:31:40 +08:00
    因为进行了回调所以叫回调函数?
    cyanhu
        6
    cyanhu  
       2015-05-21 09:32:38 +08:00
    好高深啊
    walleL
        7
    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
        8
    jadecoder  
       2015-05-21 09:48:49 +08:00
    @solupro 第一句话是解释题主的问题,第二句是我自己的疑问。明白人麻烦解释下为什么这个叫回调函数呗
    lincanbin
        9
    lincanbin  
       2015-05-21 10:11:40 +08:00
    @jadecoder 把一个function作用到一个数组上,相当于精简版的eval,这样作用,也是callback的一种。
    你搞混了回调和异步的关系了。
    Septembers
        10
    Septembers  
       2015-05-21 10:13:36 +08:00
    @walleL
    $callback_function_name='func';
    $callback_function_name($args1, $args1, $args1);
    这样写也是可以的
    akstrom
        11
    akstrom  
       2015-05-21 10:14:25 +08:00
    $funname($arg1, $arg2) 也是可以的阿
    solupro
        12
    solupro  
       2015-05-21 10:38:31 +08:00
    @jadecoder 我的理解是能被作为参数传递
    wavingclear
        13
    wavingclear  
       2015-05-21 11:43:43 +08:00
    @jadecoder 我的理解 call_user_func_array 是给用户自定义函数实现回调的一个基础设施
    jiongjionger
        14
    jiongjionger  
       2015-05-21 11:46:44 +08:00
    同步执行,非异步
    anewg
        15
    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
        16
    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
        17
    lincanbin  
       2015-05-21 15:41:24 +08:00
    @jadecoder 回调是eval功能的一个很小的子集,那么eval怎么可能被称为回调?
    另外,call_user_func_array的作用是调用一个函数作用到输入的一个array上,根据回调的定义,这就是回调啊。
    solupro
        18
    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
        19
    lincanbin  
       2015-05-21 16:00:45 +08:00
    @solupro 你说得这个,是lambda,lambda和callback也并不是对等关系。
    solupro
        20
    solupro  
       2015-05-21 16:13:32 +08:00
    @lincanbin 嗯,确实是这样。
    不过我上面那例子是说明 call_user_func_array 作为回调函数的
    linoder
        21
    linoder  
       2015-05-21 17:33:26 +08:00
    1*当前任务线程是什么状态?

    没有Swoole有,php会开多线程么?这里应该是进程吧。你都正在运行了,当然是运行态

    2*等待回调函数执行完成后释放,还是直接释放?

    进程的释放是程序生命周期结束以后干的事,都还在回调呢,怎么能算生命结束?所有事执行完之后是否

    3*call_user_func_array和多线程什么关系?

    没有关系

    4*PHP实现多线程/多进程用什么扩展?

    phpThread扩展或者Swoole扩展

    5*curl_multi 是多线程么?

    没用过,如果谁知道了,求指点

    ----------------



    欢迎打脸
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2168 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:10 · PVG 10:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.