PHP 的真正力量來自它的函數:它擁有超過 1000 個內建的函數。本文將詳細介紹php函數
[注意]關于javascript函數的詳細內容移步至此
除了內建的 PHP 函數,可以創建我們自己的函數。函數是可以在程序中重復使用的語句塊。頁面加載時函數不會立即執行。函數只有在被調用時才會執行。
用戶定義的函數聲明以關鍵字 'function' 開頭,函數名和 PHP 中的其它標識符命名規則相同。有效的函數名以字母或下劃線打頭,后面跟字母,數字或下劃線
function functionName() { 被執行的代碼;}
<?phpfunction writeMsg() { echo 'Hello world!';}writeMsg(); // 調用函數?>
可以通過參數向函數傳遞信息,參數類似變量。參數被定義在函數名之后,括號內部。可以添加任意多參數,只要用逗號隔開即可
<?phpfunction familyName($fname) { echo '$fname Zhang.<br>';}familyName('Li');familyName('Hong');familyName('Tao');familyName('Xiao Mei');familyName('Jian');?>
引用傳遞
默認情況下,函數參數通過值傳遞。如果希望允許函數修改它的參數值,必須通過引用傳遞參數
如果想要函數的一個參數總是通過引用傳遞,可以在函數定義中該參數的前面加上符號 &
<?phpfunction add_some_extra(&$string){ $string .= 'and something extra.';}$str = 'This is a string, ';add_some_extra($str);echo $str; // outputs 'This is a string, and something extra.'?>
默認參數
函數可以定義 C++ 風格的標量參數默認值
<?phpfunction setHeight($minheight=50) { echo 'The height is : $minheight <br>';}setHeight(350);setHeight(); // 將使用默認值 50setHeight(135);setHeight(80);?>
PHP 還允許使用數組 array 和特殊類型 NULL 作為默認參數
<?phpfunction makecoffee($types = array('cappuccino'), $coffeeMaker = NULL){ $device = is_null($coffeeMaker) ? 'hands' : $coffeeMaker; return 'Making a cup of '.join(', ', $types).' with $device.';}echo makecoffee();echo makecoffee(array('cappuccino', 'lavazza'), 'teapot');?>
[注意]當使用默認參數時,任何默認參數必須放在任何非默認參數的右側;否則,函數將不會按照預期的情況工作
可變參數
【func_get_args()】
func_get_args()相當于javascript函數中的arguments,以數組形式保存著實參
function demo(){ $arr = func_get_args(); $sum = 0; for($i = 0; $i<count($arr); $i++){ $sum += $arr[$i]; } return $sum;}//45echo demo(1,2,3,4,5,6,7,8,9);
此外,還有兩個常用的函數func_num_args()和func_get_arg()
func_num_args()函數返回參數總數
func_get_arg()函數接收一個數字參數,返回指定參數
function more_args() { for($i=0; $i<func_num_args(); $i++) { echo '第'.$i.'個參數是'.func_get_arg($i).'<br>'; }}more_args('one', 'two', 'three', 1, 2, 3);
如需使函數返回值,使用 return 語句。如果省略了return,則返回值為 NULL
<?phpfunction sum($x,$y) { $z=$x+$y; return $z;}echo '5 + 10 = ' . sum(5,10) . '<br>';echo '7 + 13 = ' . sum(7,13) . '<br>';echo '2 + 4 = ' . sum(2,4);?>
變量函數也叫可變函數。如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它。可變函數可以用來實現包括回調函數,函數表在內的一些用途
[注意]可變函數不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及類似的語言結構。需要使用自己的包裝函數來將這些結構用作可變函數
<?phpfunction foo() { echo 'In foo()<br />';}function bar($arg = '') { echo 'In bar(); argument was '$arg'.<br />';}// 使用 echo 的包裝函數function echoit($string){ echo $string;}$func = 'foo';$func(); // This calls foo()$func = 'bar';$func('test'); // This calls bar()$func = 'echoit';$func('test'); // This calls echoit()?>
回調函數是指將一個函數的函數名作為參數傳到另一個函數中,這個函數被稱為回調函數
function demo($num,$n){ for($i=0;$i<$num;$i++){ if($n($i)){ echo $i.'<br>'; } }}function test($i){ if($i%5){ return true; }}demo(20,'test');
call_user_func_array
使用call_user_func_array可以調用回調函數,并把一個數組參數作為回調函數的參數
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一個參數作為回調函數(callback)調用,把參數數組作(param_arr)為回調函數的的參數傳入
function demo($num,$n){ for($i=0;$i<$num;$i++){ if(call_user_func_array($n,array($i))){ echo $i.'<br>'; } }}function test($i){ if($i%5){ return true; }}demo(20,'test');
實現回調函數時,通常要使用call_user_func_array()函數,而不是變量函數,因為變量函數無法傳遞對象中的方法或和類中的靜態方法
function demo($num, $n) { for($i=0; $i<$num; $i++) { if(call_user_func_array($n, array($i))){ echo $i.'<br>'; } }} html' target='_blank'>class Filter { function one($i) { if($i%3==0) { return true; } } static function two($i) { if(preg_match('/3/', $i)) { return true; } }}demo(500, array(new Filter(), 'one'));demo(500, array('Filter', 'two'));
在函數中調用自己就是遞歸函數
<?php function test( $n ) { echo $n; if($n>0){ test($n-1); } echo $n; } test(5);//543210012345?>
使用include()函數來引入外部文件
test.phpfunction one(){ echo '111';}<?phpinclude ('test.php');one();//111?>
但如果不慎引入多次,使得函數重定義,變量重新賦值,會造成錯誤
test.phpfunction one(){ echo '111';}<?phpinclude ('test.php');include ('test.php');one();//111?>
此時,需要使用include_once()函數,來保證相同的文件只被引入一次
test.phpfunction one(){ echo '111';}<?phpinclude_once('test.php');include_once('test.php');one();//111?>
require()
引入外部文件,還可以使用require()。include( )與require( )幾乎等價,區別在于在腳本執行時包含,當處理失敗時,include( )產生一個警告而require( )則導致一個致命錯誤
[注意]require_once()與include()_once也類似
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值
其實,php的匿名函數類似于javascript中的函數表達式
[注意]匿名函數結尾一定要加分號,否則會報錯
<?php$greet = function($name){ printf('Hello %s', $name);};$greet('World');$greet('PHP');?>
閉包
PHP閉包實現主要就是靠匿名函數
將匿名函數在普通函數中當做參數傳入,也可以被返回。這就實現了一個簡單的閉包。
閉包的兩個特點:
1、作為一個函數變量的一個引用 - 當函數返回時,其處于激活狀態。
2、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。
其實上面兩點可以合成一點,就是閉包函數返回時,該函數內部變量處于激活狀態,函數所在棧區依然保留
閉包可以從父作用域中繼承變量。 任何此類變量都應該用 use 語言結構傳遞進去
$message = 'hello';$example = function () use ($message) { var_dump($message);};echo $example();//string 'hello' (length=5)PHP編程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答