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

<?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
 ?>
func_get_args函數的做用和func_get_arg很是類似,是把全部的參數當成數組來調用:
複製內容到剪貼板

代碼:數組

<?php
 function foo()
 {
     $numargs = func_num_args();
     echo "Number of arguments: $numargs\n";
 }
 
 foo(1, 2, 3);   
 ?>

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的值,咱們能夠得到不一樣的運行結果。
相關文章
相關標籤/搜索