【问题标题】:Call user func explanation呼叫用户功能说明
【发布时间】:2014-02-03 14:58:59
【问题描述】:

正如php手册所说的

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

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

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

我开始测试这个功能:

  • 函数必须是可调用的

示例 1:

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

   call_user_func('my_callback_function');
?>

示例 1 返回 true。 Bur第二个参数($parameter)呢?

示例 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'));  
 }

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

上面的所有函数示例都没有任何参数,但文档说他返回第一个参数。如果该参数不存在,如何返回?

【问题讨论】:

  • 文档表示call_user_func 的第一个参数不是您实际调用的函数。所以第一个参数是被调用的函数名。也不是更灵活的call_user_func_array

标签: php


【解决方案1】:

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

【讨论】:

  • 是的,这让我很困惑。 taht param 就是其中之一。第一个参数 = array('foo','bar'),第二个参数丢失。那个机制对此有点困惑
【解决方案2】:

任何通过 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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多