call_user_func_array,func_num_args,func_get_arg

本文深入解析了PHP中函数使用方法及call_user_func_array的调用方式,详细介绍了如何通过函数接收参数并进行处理,以及call_user_func_array如何实现灵活的参数传递。


function foo()
{
    $numargs = func_num_args();    //我想是  返回传递了多少个参数进来
    echo "Number of arguments: $numargs<br />\n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "<br />\n";   //我想是 传来的第2个参数是什么。func_get_arg(1)即,0,1
    }
    $arg_list = func_get_args();   //func_get_arg()是个数组。传进来所有数
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

foo(1, 2, 3);

exit();

function foobar($arg, $arg2, $a3)
{
echo __FUNCTION__, " 方法foobar: $arg and $arg2    和 $a3  \n    <br>";

}

class foo {
function bar($arg, $arg2) {
echo __METHOD__, " 类方法bar:got $arg and $arg2\n";

}
}

// Call the foobar() function with 2 arguments

call_user_func_array("foobar", array("one", "two", "three"));   //我想是 call_user_func_array调用方法,并传参数进去(array方式)

// Call the $foo->bar() method with 2 arguments

$foo = new foo;

call_user_func_array(array($foo, "bar"), array("three", "four"));

 

exit();

### `_func()` 的作用 在宏 `oplus_chg_ic_func` 中,`_func()` 是一个函数指针调用。其作用是尝试调用通过 `ic->get_func(ic, func_id)` 获取的函数。若 `ic` 不为空且 `ic->get_func` 存在,就会调用该函数获取对应 `func_id` 的函数指针;若获取成功,就会调用该函数并传入相应参数;若获取失败或者函数指针为空,就返回 `-ENOTSUPP` 表示不支持该操作 [^1]。 ### `_func()` 处理传入参数的方式 `_func()` 处理传入参数的方式取决于 `_func` 所指向的实际函数的定义。在宏 `oplus_chg_ic_func` 中,`_func` 被调用时,会传入 `ic` 和可变参数列表 `__VA_ARGS__`。具体而言,`ic` 作为第一个参数传递给 `_func`,而可变参数列表 `__VA_ARGS__` 会原样传递给 `_func`。 以下是一个示例代码,展示了 `_func()` 如何处理传入的参数: ```c #include <stdio.h> #include <errno.h> // 假设的结构体和函数类型定义 typedef struct { void* (*get_func)(void *, int); } IC; typedef int (*func1_T)(void *, int, int); void* get_func(void *ic, int func_id) { return (void*)func1_T; } int func1(void *ic, int arg1, int arg2) { printf("func1 called with arg1: %d, arg2: %d\n", arg1, arg2); return arg1 + arg2; } #define oplus_chg_ic_func(ic, func_id, ...) ({ \ func_id##_T _func = (ic && ((IC *)ic)->get_func) ? ((IC *)ic)->get_func(ic, func_id) : NULL; \ _func ? _func(ic, ##__VA_ARGS__) : -ENOTSUPP; \ }) int main() { IC ic; ic.get_func = get_func; int result = oplus_chg_ic_func(&ic, func1, 10, 20); printf("Result: %d\n", result); return 0; } ``` 在上述代码中,`func1` 函数接受三个参数:`void *ic`、`int arg1` 和 `int arg2`。在调用 `oplus_chg_ic_func` 时,传入了三个参数 `&ic`、`func1`、`10` 和 `20`。`_func` 指向 `func1`,调用 `_func(ic, ##__VA_ARGS__)` 实际上就是调用 `func1(&ic, 10, 20)`。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值