免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4024 | 回复: 4
打印 上一主题 下一主题

[技巧] 我们平常很少用到的PHP中处理函数的函数(Function Handling Functions)[转] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-14 01:52 |只看该作者 |倒序浏览
我们平常很少用到的PHP中处理函数的函数(Function Handling Functions)call_user_func_array — 让参数以数组的形式调用一个函数
call_user_func — 调用一个存在的函数
create_function — 建立一个函数
func_get_arg — 获取函数中某个参数的值
func_get_args — 获取函数的所有参数并组成数组
func_num_args — 获取一个函数的参数个数
function_exists — 判定一个函数是否存在
get_defined_functions — 获取已有的函数信息
register_shutdown_function — 注册一个页面载入完成后运行的函数
register_tick_function — 注册一个按要求调用的函数
unregister_tick_function — 取消一个按要求调用的函数

get_defined_functions可以获取所有的PHP函数和自定义的函数: 复制内容到剪贴板 代码:
<?php
function a(){}
$b = get_defined_functions();
print_r($b);
//也许会显示1000多个已定义了的函数:)
?>

function_exists函数判定一个函数是否存在(可以是PHP函数,也可以是自定义函数)。 复制内容到剪贴板 代码:
<?php
if (function_exists('a')) {
    echo "yes";
} else {
    echo "no";
}
function a(){}
// 显示 yes
?>

call_user_func函数类似于一种特别的调用函数的方法,使用方法如下: 复制内容到剪贴板 代码:
<?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,也是满有新意的: 复制内容到剪贴板 代码:
<?php
class a {
    function b($c)
    {
        echo $c;
    }
}
call_user_func(array("a", "b"),"111");
//显示 111
?>

call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰: 复制内容到剪贴板 代码:
<?php
function a($b, $c)
{
    echo $b;
    echo $c;
}
call_user_func_array('a', array("111", "222"));
//显示 111 222
?>

call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致: 复制内容到剪贴板 代码:
<?php
function a(&$b)
{
    $b++;
}
$c = 0;
call_user_func('a', &$c);
echo $c;//显示 1
call_user_func_array('a', array(&$c));
echo $c;//显示 2
?>

func_num_args函数可以获取函数接受到参数的数量: 复制内容到剪贴板 代码:
<?php
function a()
{
    echo func_num_args();
}
a(111, 222, 333);
//显示 3
?>

func_get_arg函数可以获取某一个传递过来参数的值,在下面的例子中,在函数中并没有具体说明有哪些参数会被接受,利用func_get_arg还可以获取额外的参数: 复制内容到剪贴板 代码:
<?php
function a()
{
     echo func_get_arg(1);
}
a (111, 222, 333);
//显示 222
?>

http://www.itokit.com/
func_get_args函数的作用和func_get_arg非常相似,是把所有的参数当成数组来调用: 复制内容到剪贴板 代码:
<?php
function a()
{
    $numargs = func_num_args();
    $b = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo $b[$i];
    }
}
a(111, 222, 333);
//显示 111 222 333
?>


create_function函数可以建立一个匿名的函数(函数名被PHP默认为lambda_1,lambda_2),样子比较古怪,但是形式比较奇特,要注意第二个参数内的语句要有“;”分隔: 复制内容到剪贴板 代码:
<?php
$newfunc = create_function('$a,$b', 'return $a + $b;');
echo $newfunc;
echo $newfunc(2, 3);
//显示 lambda_1 5
?>

register_shutdown_function函数可以注册一个在页面载入完成之后运行的函数(功能有点像缓存),register_shutdown_function也可以像call_user_func函数一样用作对类内部方法的调用: 复制内容到剪贴板 代码:
<?php
function a() {
   echo  222 ;
}
echo 111;
register_shutdown_function('a');
//显示 111 222
?>

<?php
class a
{
   function b ($c)
   {
      echo $c;
   }
}
register_shutdown_function (array ('a', 'b'), '111');
//显示 111
?>


register_tick_function函数和unregister_tick_function函数必须要和declare流程控制机制合并使用,那么就先了解一下declare和tick:
declare (directive){
statement
}
Tick 是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。在每个 tick 中出现的事件是由 register_tick_function() 来指定的。举例如下: 复制内容到剪贴板 代码:
<?
function foo($str) {
static $i = 0;
print "$str: $i<br>";
$i++;
}
register_tick_function("foo", "count");
declare (ticks = 6) {
for($i=0; $i<20; $i++) {
echo "$i<br>";
}
}
?>

在这个例子中的declare(ticks = N){statement}流程控制里面,每执行6行(ticks = 6)代码,就需要运行一次foo()函数,通过更改ticks的值,我们可以获得不同的运行结果。

转自 :http://www.itokit.com/bbs/redirect.php?tid=1748&goto=lastpost

[ 本帖最后由 achieverain 于 2008-4-14 02:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-14 16:47 |只看该作者
确实很少用到,除了几个调用函数的外

论坛徽章:
0
3 [报告]
发表于 2008-04-14 18:30 |只看该作者
还有一种调用方法,我觉得写起来更舒服
  1. class foo{
  2.     public static function methodname(){
  3.         echo 'called';
  4.     }
  5. }
  6. $method='methodname';
  7. if(method_exists('foo',$method))
  8.     foo::$method();
  9. $o=new foo();
  10. if(method_exists($o,$method))
  11.     $o->$method();
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-04-15 13:28 |只看该作者
还挺常用的,但是用的地方不多,呵呵

论坛徽章:
0
5 [报告]
发表于 2008-04-16 10:31 |只看该作者
除了 register_tick_function 和 unregister_tick_function, 其它都很常用到.

有谁用 declare() 语句写过程序吗? 分享一下. 我自己从没用过, 也没见别人用过.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP