【PHP】解析PHP中的函式
目錄結構:
contents structure [+]
在這篇文章中,筆者將會講解如何使用PHP中的函式,PHP是一門弱語言型別,相比較於強語言型別(java、c++,c#等),在函式方面也提供了更大的靈活性。
1.可變引數函式
PHP中可以通過func_get_args函式獲得引數陣列的資訊,或者通過func_get_args獲得引數的數目。
func_get_args獲得的是目標引數的副本組成的陣列。
看如下的案例:
<?phpfunction 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來傳遞在閉包中能夠使用的父級屬性。若有多個父級屬性要在閉包中使用的話,那麼在這些屬性之前用逗號隔開就可以了。