调用可变函数

根据一个变量的值来调用不同的函数
使用call_user_func():
// 定义一个名为 get_file 的函数,它接受一个参数 $filename。
// 这个函数的目的是读取并返回指定文件的内容。
function get_file($filename){
// 使用 file_get_contents 函数读取 $filename 指定的文件内容。
// file_get_contents 函数会将文件内容作为字符串返回。
// 如果文件不存在或无法读取,该函数会返回 FALSE。
return file_get_contents($filename);
}

// 定义一个变量 $function,并将其赋值为字符串 'get_file'。
// 这里,$function 存储了之前定义的函数名。
$function = 'get_file';

// 定义一个变量 $filename,并将其赋值为字符串 'graphic.png'。
// 这个变量存储了想要读取内容的文件名。
$filename = 'graphic.png';

// 使用 call_user_func 函数调用之前存储在 $function 变量中的函数名。
// call_user_func 函数接受至少一个参数:要调用的函数名。
// 之后的参数(本例中为 $filename)将作为传递给该函数的参数。
// 在这个例子中,它相当于调用了 get_file('graphic.png')。
call_user_func($function, $filename);

// 注意:上面的 call_user_func 调用实际上读取了 'graphic.png' 文件的内容,
// 但是并没有对返回的内容做任何处理(比如打印输出或存储到变量中)。
// 如果想要看到文件内容或进行进一步处理,你需要对 call_user_func 的返回值进行操作,
// 例如:$content = call_user_func($function, $filename); echo $content;

//////////////////////////////////////////////////////////////////////////////////////

函数接受个数可变的参数时,可以使用call_user_func_array():
//这是一个日志记录函数,接受printf风格的格式化指示符
//它输出一个时间戳、字符串和一个换行符
function logf(){
$date = date(DATE_RSS);
$args = func_get_args();
return print "$date:" . call_user_func_array('sprintf', $args);
}

logf('%s','http://developer.ebay.com','eBay Developer Program');

///////////////////////////////////////////////////////////////////////////////////
如果可能有多个要调用的函数,可以使用一个函数名关联数组:
php
// 定义一个关联数组$dispatch,用于映射命令字符串到对应的函数名称字符串
$dispatch = array(
'add' => 'do_add', // 当命令为'add'时,映射到函数名'do_add'
'Commit' => 'do_commit', // 当命令为'Commit'时,映射到函数名'do_commit'
'checkout' => 'do_checkout', // 当命令为'checkout'时,映射到函数名'do_checkout'
'update' => 'do_update' // 当命令为'update'时,映射到函数名'do_update'
);

// 从HTTP请求中获取名为'command'的参数值,若不存在则默认为空字符串
$cmd = (isset($_REQUEST['command']) ? $_REQUEST['command'] : '');

// 检查变量$cmd(即从请求中获取的命令)是否是$dispatch数组的一个键
if (array_key_exists($cmd, $dispatch)) {
// 如果是,则从$dispatch数组中获取对应的函数名称字符串
$function = $dispatch[$cmd];

// 使用call_user_func函数调用获取到的函数名对应的函数
// 注意:这里假设对应的函数已经在代码的其他部分被定义
call_user_func($function);

} else {
// 如果$cmd不是$dispatch数组的一个键,则记录一条错误日志
// 注意:这里的日志记录可能不会立即显示给用户,而是存储在服务器的日志文件中
error_log("Unknown command $cmd");
}

注意事项和潜在问题

  1. 函数命名问题:在$dispatch数组中,函数名似乎是以'do '为前缀,后跟动作名称(如'do add')。然而,根据PHP的命名习惯,函数名通常不包含空格。这里可能是一个错误,正确的函数名应该类似于'do_add'。在上面的注释中,我已经假设并更正了这一点。

  2. 安全性问题:直接从HTTP请求中获取命令并执行相应的函数可能存在安全风险,特别是如果这些函数可以执行敏感操作。在实际应用中,应该增加额外的安全检查,比如验证用户的权限,或者限制可以执行的命令列表。

  3. 错误处理:当尝试调用一个不存在的函数时,call_user_func会抛出一个警告。在实际应用中,可能希望捕获这些错误并以更友好的方式处理它们,比如向用户显示一个错误消息而不是仅仅记录日志。

  4. 代码健壮性:考虑到代码的可维护性和健壮性,最好为所有可能的操作定义明确的函数,并在调用它们之前检查这些函数是否存在。这可以通过使用function_exists函数来实现。

  5. 大小写敏感性:PHP中的函数名是大小写不敏感的,但数组键是大小写敏感的。因此,确保传递给array_key_exists的键与$dispatch数组中定义的键完全匹配(包括大小写)是很重要的。

posted @   kksllss  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示