PHP函式處理函式
call_user_func:把第一個引數作為回撥函式呼叫。
call_user_func_array:呼叫回撥函式,並把一個數組引數作為回撥函式的引數。
<?php namespace ns{ function foo($arg1,$arg2){ echo "call function:".__FUNCTION__.",with arg1:$arg1,arg2:$arg2\n"; } class A { function fooInA($arg1,$arg2){ echo "call function:".__NAMESPACE__.'\\'.__FUNCTION__.",with arg1:$arg1,arg2:$arg2\n"; } } } namespace { function foo($arg1,$arg2){ echo "call function:".__FUNCTION__.",with arg1:$arg1,arg2:$arg2\n"; } class A { function fooInA($arg1,$arg2){ echo "call function:".__FUNCTION__.",with arg1:$arg1,arg2:$arg2\n"; } } $params=array("var1","var2"); //呼叫函式 call_user_func("foo","var1","var2"); call_user_func(foo,"var1","var2"); call_user_func_array("foo",$params); call_user_func_array(foo,$params); //呼叫類中函式 $a=new A; call_user_func(array('A',"fooInA"),"var1","var2"); call_user_func(array($a,"fooInA"),"var1","var2"); call_user_func_array(array('A',"fooInA"),$params); call_user_func_array(array($a,"fooInA"),$params); //呼叫名稱空間中的函式 call_user_func(__NAMESPACE__.'\ns\foo',"var1","var2"); call_user_func(array(__NAMESPACE__.'\ns\A',"fooInA"),"var1","var2"); call_user_func(__NAMESPACE__.'\ns\A::fooInA',"var1","var2"); call_user_func_array(__NAMESPACE__.'\ns\foo',$params); call_user_func_array(array(__NAMESPACE__.'\ns\A',"fooInA"),$params); call_user_func_array(__NAMESPACE__.'\ns\A::fooInA',$params); } ?>
func_get_arg:返回引數列表的某一項。引數的偏移量從0開始計算。
func_get_args:返回一個包含函式引數列表的陣列。
func_num_args:返回傳遞給函式的引數個數。
<?php function foo(){ $num_args=func_num_args(); echo "$num_args arguments passed,"; if($num_args>0){ $last_arg=func_get_arg($num_args-1); echo "last argument is $last_arg\n"; echo "all arguments are ".join(",",func_get_args()); }else{ echo "no argument passed\n"; } } foo('a','b','c'); foo(); ?>
forward_static_call:用提供的引數呼叫靜態方法,不能在類外呼叫此函式。
forward_static_call_array:呼叫靜態方法,並把一個數組引數作為回撥函式的引數。
<?php class A{ static function foo(){ $num_args=func_num_args(); echo "$num_args arguments passed,"; if($num_args>0){ $last_arg=func_get_arg($num_args-1); echo "last argument is $last_arg\n"; echo "all arguments are ".join(",",func_get_args())."\n"; }else{ echo "no argument passed\n"; } } } class B{ function test(){ forward_static_call(array('A','foo'),'a','b','c'); forward_static_call_array(array('A','foo'),array('a','b','c')); } } $b=new B; $b->test(); B::test(); ?>
create_function:從傳遞的引數中建立一個匿名函式,並返回它的唯一名稱。
function_exists:在已經定義的函式列表(包括系統自帶的函式和使用者自定義的函式)中查詢指定的函式,如果存在則返回true,對於include_once、echo等語法結構,會返回false。
get_defined_functions:返回所有已定義的函式的陣列。PHP7.0.15、PHP7.1.1增加一個可選的引數,表示是否去除返回陣列中被禁用的函式,預設為false。返回的陣列包含兩部分,一部分是內建函式,另一部分是使用者定義的函式,可通鍵internal來訪問系統內建函式,通過鍵user來訪問使用者自定義函式。返回的陣列中不包括匿名函式。
<?php
$func=create_function('$arg1,$arg2','return $arg1+$arg2;');
echo "$func\n";
echo $func(1,2)."\n";
var_dump(function_exists("chr"));
function foo(){
echo "foo";
}
$funcs=get_defined_functions();
//var_dump($funcs);
var_dump($funcs["internal"]);
var_dump($funcs["user"]);
?>
register_shutdown_function:註冊一個會在php中止時執行的函式,註冊的回撥函式會在指令碼執行完成或exit函式被呼叫後執行。可以多次呼叫register_shutdown_function函式來註冊多個函式,這些函式會按註冊時的順序依次被呼叫,如果被註冊的函式內部呼叫了exit函式,則所有處理會被中止,並且註冊的其他回撥函式也不會被呼叫。
register_tick_function:註冊每個時鐘週期(ticks)要執行的函式。
unregister_tick_function:取消註冊的每個時鐘週期(ticks)要執行的函式。
<?php
declare(ticks=1);
function tick_handler(){
echo __METHOD__." called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print $a."\n";
}
?>
<?php
declare(ticks=1);
function tick_handler(){
echo __METHOD__." called\n";
}
function tick_handler2(){
echo __METHOD__." called\n";
}
register_tick_function('tick_handler');
register_tick_function('tick_handler2');
unregister_tick_function('tick_handler2');
$a = 1;
if ($a > 0) {
$a += 2;
print $a."\n";
}
?>