1. 程式人生 > >【PHP】解析PHP中的函式

【PHP】解析PHP中的函式

目錄結構:

contents structure [+]
  1. 可變引數的函式
  2. 變數函式
  3. 回撥函式
  4. 自定義函式庫
  5. 閉包(Closure)函式的使用

在這篇文章中,筆者將會講解如何使用PHP中的函式,PHP是一門弱語言型別,相比較於強語言型別(java、c++,c#等),在函式方面也提供了更大的靈活性。

1.可變引數函式

PHP中可以通過func_get_args函式獲得引數陣列的資訊,或者通過func_get_args獲得引數的數目。
func_get_args獲得的是目標引數的副本組成的陣列。

看如下的案例:

<?php
function foo() { $numargs = func_num_args(); echo "引數數量 : $numargs \n"; if ($numargs >= 2) {//獲得第二個引數的值 echo "第二個引數是: " . func_get_arg(1) . "\n"; } $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "引數 $i 是: " . $arg_list[$i] . "\n"; } } foo(
1, 2, 3); ?>

輸出:

引數數量 : 3
第二個引數是: 2
引數  0 是: 1
引數  1 是: 2
引數  2 是: 3

 

在PHP5.6及以上版本中,提供了...的語法格式來支援可變引數。

2.變數函式

<?php
function add($a,$b){
    return $a + $b;
};
function subs($a,$b){
    return $a - $b;
};
$val = "add";//將函式名"add"賦給變數$val, 執行$val()時則呼叫函式add()
echo
$val(1,2)."\n";//3 $val = "subs";//將函式名"subs"賦給變數$val, 執行$val()時則呼叫函式subs() echo $val(1,2)."\n";//-1 ?>

3.回撥函式

<?php
function cal($fun){
    for($i = 0;$i < 100 ;$i++){
        if( $fun($i) ){
            echo $i."\n";
        }
    }
};
//如果是迴文數就返回true,否則false
function val($num){
    if($num == strrev($num))
        return true;
    return false;
}
cal("val");
?>

還可以通過call_user_func_array函式來呼叫一個函式。

<?php
namespace MyProject;//宣告名稱空間MyProject

class myClass{
    function myfunc($arg1,$arg2){
        echo " class name = ".__CLASS__."\n";
        echo " function name = ".__FUNCTION__."\n";
        echo " method name = ".__METHOD__."\n";
        echo " file dir = ".__DIR__."\n";
        echo " current line = ".__LINE__."\n";
        echo " name space = ".__NAMESPACE__."\n";
        
        echo " arg1 = ".$arg1."\n";
        echo " arg2 = ".$arg2."\n";
    }
}
$myClass = new namespace\myClass();
call_user_func_array(array($myClass,"myfunc"),array(1,2));
?>

輸出結果如下:

 class name = MyProject\myClass
 function name = myfunc
 method name = MyProject\myClass::myfunc
 file dir = C:\wamp\www
 current line = 10
 name space = MyProject
 arg1 = 1
 arg2 = 2

其中:
__CLASS__ 類名稱
__METHOD__ 方法名稱
__FUNCTION__ 函式名稱。
__DIR__ 檔案目錄
__LINE__ 當前行
__NAMESPACE__ 名稱空間

call_user_func_array只接受兩個引數,第一個是函式名,如果是引用型別,那麼就應該使用陣列。第二個是一個數組引數。

4.自定義函式庫

自定義函式庫需要使用到include和require方法,這兩個方法都可以用於引入別的php檔案。但是include方法在遇到錯誤後,指令碼會繼續執行。require方法在引入檔案遇到錯誤後,指令碼不會繼續執行。
定義一個php檔案,檔名為test1.php:

<?php
echo "I come from another php file<br/>";

然後再定義一個檔案,檔名test2.php:

<?php

include 'test1.php';

echo "<hr/>";

echo "I am this file content";

然後通過web瀏覽器,會看到如下輸出結果:


在test2.php檔案中成功引入了test1.php檔案的內容。
require和include的功能類似,但是require在引入過程中,遇到錯誤的話,會終止指令碼的執行。

如果我們執行如下程式碼:

<?php

include 'test3.php';

其中test3.php檔案不存在,這時候include會產生警告。

如果換成require的話,就會產生致命錯誤。


include和require每包含一次檔案就會執行檔案中的內容,如果只需要在最開始包含那次執行檔案的內容,那麼就可以用include_once()和require_once()方法。

5.閉包(Closure)的使用

PHP 5.3新添加了閉包的功能,PHP中的閉包目前和別的語言的閉包(比如javascript)不一樣,javascript可以被認為是一種作用域,它預設繼承父容器的作用域。然而在PHP中,必需手動繫結傳遞的引數。
看下面的案例:

<?php
function Calc($frombase){
    return function($number,$tobase) use($frombase){
        return base_convert($number, $frombase, $tobase);//轉化為指定進位制
    };
}
//得到一個從10進位制開始轉化的匿名函式
$fun = Calc(10);

print "binary = ".$fun(20,2)."\n";
print "octal  = ".$fun(20,8)."\n";
print "hex    = ".$fun(20,16)."\n";
?>

輸出結果為:

binary = 10100
octal  = 24
hex    = 14

 

在上面的程式碼中使用use來傳遞在閉包中能夠使用的父級屬性。若有多個父級屬性要在閉包中使用的話,那麼在這些屬性之前用逗號隔開就可以了。