一個函數可由如下的語法來定義。任何有效的 PHP 代碼都有可能出如今函數內部,甚至包括其它函數和類定義。php
函數名和 PHP 中的其它標識符命名規則相同。有效的函數名以字母或下劃線打頭,後面跟字母,數字或下劃線。能夠用正則表達式表示爲:[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*。html
PHP 中的全部函數和類都具備全局做用域,能夠在內部定義外部調用,反之亦然。正則表達式
PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數。數組
Note: 函數名是大小寫無關的,不過在調用函數的時候,一般使用其在定義時相同的形式。閉包
在 PHP 中能夠調用遞歸函數。可是要避免遞歸函數/方法調用超過 100-200 層,由於可能會破壞堆棧從而使當前腳本終止。spa
經過參數列表能夠傳遞信息到函數,即以逗號做爲分隔符的表達式列表。.net
PHP 支持按值傳遞參數(默認),經過引用傳遞參數以及默認參數。也支持可變數量的參數。code
缺省狀況下,函數參數經過值傳遞(於是即便在函數內部改變參數的值,它並不會改變函數外部的值)。若是但願容許函數修改它的參數值,必須經過引用傳遞參數。htm
若是想要函數的一個參數老是經過引用傳遞,能夠在函數定義中該參數的前面預先加上符號 &:
函數能夠定義 C++ 風格的標量參數默認值,以下:
PHP 還容許使用數組和特殊類型 NULL 做爲默認參數,
默認值必須是常量表達式,不能是諸如變量,類成員,或者函數調用等表達式。
請注意當使用默認參數時,任何默認參數必須放在任何非默認參數的右側;不然,函數將不會按照預期的狀況工做。
值經過使用可選的返回語句返回。能夠返回包括數組和對象的任意類型。返回語句會當即停止函數的運行,而且將控制權交回調用該函數的代碼行。
函數不能返回多個值,但能夠經過返回一個數組來獲得相似的效果。
從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用操做符 & :
匿名函數(Anonymous functions),也叫閉包函數(closures),容許臨時建立一個沒有指定名稱的函數。最常常用做回調函數(callback)的參數。
閉包函數也能夠做爲變量的值來使用。PHP會自動把表達式轉換成內置類Closure的 對象實例。把一個closure對象賦值給一個變量的方式與普通變量賦值的語法是同樣的,最後也要加上分號。
1 <?php 2 $greet = function($name) 3 { 4 printf("Hello %s ", $name); 5 }; 6 7 $greet('World'); 8 $greet('PHP'); 9 ?>
Closure對象也會從父做用域中繼承類屬性。這些變量都必須在函數或類的頭部聲明。從父做用域中繼承 變量與使用全局變量是*不一樣*的。全局變量存在於一個全局的範圍,不管當前在執行的是哪一個函數。而closure 的父類做用域則是聲明該closure的函數(不必定要是它被調用的函數)。