php回调函数call_user_func和call_user_func_array详解

call_user_func($fun);

call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下:

1.调用 普通函数:

<?php
function a($b, $c) {
    echo $b;
    echo $c;
}
call_user_func(‘a‘, "111", "222");
call_user_func(‘a‘, "333", "444");
//显示 111 222 333 444
?>

调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:

2.调用 类的方法(包括类的静态的方法与实例对象方法)

<?php
class a {
    function b($i) {
        echo $i;
    }
    public static c($k) {
        echo $k;
    }
}

//当php <5.3时,可以如下使用,此时会把 b()方法当作是a的一个静态方式。
call_user_func(array("a", "b"), "111");

//当php >=5.3时,类的公开的非静态的方法必须在类实例化后方可被调用,否则会提示Strict性错误(为了兼容先前及以后的版本,还是用对象方法传入)。
$obj = new a;
call_user_func(array($obj, "b"), "111");//显示 111

//静态方法可以如下方式调用
call_user_func(array("a", "b"), "111");
//或
call_user_func("a::b","111");
?>

call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:

call_user_func_array($fun,$arr);
<?php
function a($b, $c) {
    echo $b;
    echo $c;

}

call_user_func_array(‘a‘, array("111", "222"));
//显示 111 222
?>

call_user_func_array 函数也可以调用类内部的方法的,只不过是后面传参要以数组的形式传入而已。

<?php
Class ClassA
{

    function bc($b, $c) {
        $bc = $b + $c;
        echo $bc;
    }

    function d() {
         $bc = $b + $c;
         echo $bc;
    }
}

//php<5.3时,非静态的方法可直接传入类名
call_user_func_array(array(‘ClassA‘, ‘bc‘), array("111", "222"));

//php>=5.3时,非静态的方法 只有在类被实例化后方可调用,否则会提示Strict性错误
$obj = new classA;
call_user_func_array(array($obj, ‘bc‘), array("111", "222"));

//静态方法调用如下
call_user_func_array(array(‘ClassA‘,‘bc‘), array("111", "222"));
//或
call_user_func_array(‘ClassA::bc‘, array("111", "222"));
?>

call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:

<?php
function a(&$b) {
    $b++;
}

$c = 0;
call_user_func(‘a‘, &$c);//注意,5.*版本中,call_user_func不提倡引用传递,提示已过时。
echo $c;//显示 1
call_user_func_array(‘a‘, array(&$c));
echo $c;//显示 2
?>

http://php.net/manual/zh/function.call-user-func.php

http://php.net/manual/zh/function.call-user-func-array.php

转 :https://www.cnblogs.com/52php/p/5659978.html

http://qianyunlai.com/

时间: 2024-10-10 22:59:01

php回调函数call_user_func和call_user_func_array详解的相关文章

函数WideCharToMultiByte() 详解

函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, LPCSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, PBOOL pfUsedDefaultChar ); 函数功能: 此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集. (---Uni

JS函数动作分层结构详解及Document.getElementById 释义 事件 函数 变量 script标签 var function

html +css 静态页面 js     动态 交互 原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向的时候换一个颜色,就是一个修改样式的工具. 编写JS的流程 布局:HTML+CSS 事件:确定用户做哪些操作(产品设计) 编写JS:在事件中,用JS来修改页面元素的样式(外加属性:确定要修改哪些属性) 什么是事件 一个完整的事件= <在某个作用域 事件声明='函数动作'> </> 作用域:

PHP回调函数及匿名函数概念与用法详解

1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在php调用回调函数,不想c以及java那样直接使用函数名作为函数参数,而是在php中使用函数对应的字符串名称执行 1.1.无参数回调 <?php //无参数回调 function callback(){ echo 'execute no parameters callback.<br/>'; }

[转载]Linux C 字符串函数 sprintf()、snprintf() 详解

一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致 sprintf 比 printf 有用得多.所以本文着重介绍 sprintf,有时也穿插着用用 pritnf. sprintf是个变参函数,定义如下: int sprintf( char *buffer, const char *format [

JavaScript箭头函数中的this详解

前言 箭头函数极大地简化了this的取值规则. 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () { console.log("Hello, Fundebug!"); } 箭头函数指的是用=>定义的函数: var hello = () => { console.log("Hello, Fundebug!"); } JavaScript箭头函数与普通函数不只是写法上的区别,它们还有一些微妙的不

php函数call_user_func、call_user_func_array使用方法

使用方法: 1. function aa() { echo 'cjy'; } call_user_func('aa'); 2. class A { static function aa($a, $b, $c) { echo "{$a}{$b}{$c}"; } } call_user_func('A::aa', 1, 2, 3); 3. class A { static function aa($a, $b, $c) { echo "{$a}{$b}{$c}"; }

第33讲:List的一阶函数操作代码实战详解

操作的参数不是函数,就是一阶函数 我们通过具体的代码来说明: package com.dt.scala.dataset object ListFirstOrderOps {   def main(args: Array[String]): Unit = {     //列表合并,使用:::操作符     println(List(1,2):::List(3,4):::List(5,6))     println(List(1,2):::(List(3,4):::List(5,6)))     /

函数返回值return详解—JS学习笔记2015-6-16(第58天)

一.return return后面接的实际上就是一个数据类型: <script> // fn1(); =>100 alert(fn1().length); function fn1(){ // return 100; return 'miaov'; } </script> 1).函数名+(): fn1() ==> return后面的值: 2).return 实际上是所有函数内一个隐藏的属性,默认返回undefined: 3).return 后面的任何代码都不会执行. 二

函数通信和递归详解

一 函数通信 函数通信就是不同函数之间如何实现变量的共享交换.实现方法大概有三种:参数传递,返回值,全局变量.下面举例来说明这3中方法. 1 参数传递就是把函数名当做另外一个函数的参数来传递,这样2个函数就可以相互通信,为了方便使用了JavaScript语法. function fn1(str){ console.log(str); }; function fn2(fn1){ fn1("Hello World"); }; fn2(fn1); 上面代码fn2可以利用参数fn1,在自己的函