PHP 的 callback 类型

来源:互联网 发布:mac访问nas共享文件夹 编辑:程序博客网 时间:2024/06/15 05:33

原文 : http://hdwong.com/articles/2009/06/00000044.html

在前一篇文章 深入 Drupal 引导流程 (3) - session_set_save_handler 中,提及到一种 callback 类型,在 PHP 原生类型里面并没有一种类型叫做 callback,按照官方文档的说法,callback 仅仅是在文档里面提及到的虚构类型 (伪类型)。callback 就是回调的意思,顾名思义它常被以参数的方式传递给其他函数,让别人来调用自己。PHP 的 callback 可以包括全局函数和类方法。

callback 的有效表示方法有以下几种

  1. 全局函数

    function bar($string)
    {
      echo $string;
    }
    call_user_func('bar', 'Hello world.');
    // 输出 Hello world.

  2. 对象方法

    class foo
    {
      function bar($string)
      {
        echo $string;
      }
    }
    $obj = new foo;
    call_user_func(array($obj, 'bar'), 'Hello world.');
    // 输出 Hello world.
    // PHP4 下 $obj 需要写成 &$obj,解析在文章最后

  3. 静态类方法

    class foo
    {
      static function bar($string)
      {
        echo $string;
      }
    }
    call_user_func(array('foo', 'bar'), 'Hello world.');
    // 输出 Hello world.
    call_user_func('foo::bar', 'Hello world.');
    // 同样也是输出 Hello world. 这种语法只适用于 PHP 5.2.3 以上

  4. 类内部调用

    class foo
    {
      function bar($string)
      {
        echo $string;
      }
      function callback()
      {
        call_user_func(array('self', 'bar'), 'Hello world.');
        // 输出 Hello world.
      }
    }
    foo::callback();

    以上是静态调用,如果是对象的内部调用,只需要改成

    call_user_func(array($this, 'bar'), 'Hello world.');

    注意 : 如果是 PHP 4,那么 $this 需要写成 &$this 来显式的传递引用,否则 PHP 会传递一个对象的拷贝过去的,而 PHP 5 后对象的传递默认就已经是引用了

本文仅使用 call_user_func 来举例 callback 的用法,实际中上述的表示方法可以在任何文档中标识为 callback 的类型,如 usort、array_map 等