1. 程式人生 > >PHP函式處理函式

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";
}

?>