【PHP】解析PHP中的函數

目錄結構:javascript

contents structure [-]

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

1.可變參數函數

PHP中能夠經過func_get_args函數得到參數數組的信息,或者經過func_get_args得到參數的數目。
func_get_args得到的是目標參數的副本組成的數組。

看以下的案例:java

<?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);
?>

輸出:c++

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

 

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

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函數來調用一個函數。c#

<?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來傳遞在閉包中可以使用的父級屬性。如有多個父級屬性要在閉包中使用的話,那麼在這些屬性以前用逗號隔開就能夠了。

相關文章
相關標籤/搜索