调用用户函数说明

时间:2014-02-03 14:59:00

标签: php

正如php手册所说

  • call_user_func - 调用第一个参数给出的回调
  

混合call_user_func(可调用$ callback [,混合$参数[,混合   $ ...]])

  • 调用第一个参数给出的回调,并将其余参数作为参数传递。

我开始测试这个功能:

  • 功能必须可调用

示例1:

<?php
   function my_callback_function() {
      echo 'hello world!';
   }

   call_user_func('my_callback_function');
?>

示例1返回true。那么第二个参数($参数)怎么样?

示例2:

namespace Test;

class Foo
{
    static public function bar()
    {
        echo "Hello world!\n";
    }
}

call_user_func(__NAMESPACE__ . '\Foo::bar');  // true
call_user_func(array(__NAMESPACE__ . '\Foo', 'bar')); // true
call_user_func('Test\Foo::bar');  // false <error>

在这个例子中,我省略了第二个参数,他返回TRUE。

示例3:

class Foo
{
    public function bar()
    {
        echo "Hello world";
    }
}
if (is_callable(array('foo', 'bar'))) {
   call_user_func(array('foo', 'bar'));  
 }

很困惑,因为文档说“调用第一个参数给出的回调”

上面的所有函数示例都没有任何参数,但是文档说他回到了第一个参数。如果那个参数不存在,怎么回事?

2 个答案:

答案 0 :(得分:0)

代码call_user_func( array('foo','bar') )使用单个参数调用call_user_func(),该参数为array,但仍为单个参数。

答案 1 :(得分:0)

任何通过is_callable测试的内容都有资格传递给call_user_func和call_user_func_array的第一个参数。这包括:

函数名称为字符串

function test(){
    echo "Hello World";
}
call_user_func("test");

静态方法

class A {
    public static function test(){
        echo "Hello World";
    }
}
call_user_func(array("A", "test"));

实例方法

 class A {
     public  function test(){
         echo "Hello World";
     }
}

$a = new A();
call_user_func(array($a, "test"));

匿名函数/闭包

$a = function(){ echo "Hello World"; } 
call_user_func($a);

另请注意,在上面的示例中:

call_user_func('Test\Foo::bar');  

产生错误......这是因为它在Test名称空间中运行,所以函数被解析为\Test\Test\Foo::bar如果你已经完成了这将有效:

call_user_func('\Test\Foo::bar');