## 用戶自定義函數
一個函數可由以下的語法來定義:
**Example #1 展示函數用途的偽代碼**
```<?php
function?foo($arg_1,?$arg_2,?/*?...,?*/?$arg_n)
{
????echo?"Example?function.\n";
????return?$retval;
}
?>
```
任何有效的 PHP 代碼都有可能出現在函數內部,甚至包括其它函數和[類](http://php.net/manual/zh/language.oop5.basic.php#language.oop5.basic.class)定義。
函數名和 PHP 中的其它標識符命名規則相同。有效的函數名以字母或下劃線打頭,后面跟字母,數字或下劃線。可以用正則表達式表示為:*\[a-zA-Z\_\\x7f-\\xff\]\[a-zA-Z0-9\_\\x7f-\\xff\]\**。
**Tip**
請參見[用戶空間命名指南](http://php.net/manual/zh/userlandnaming.php)。
函數無需在調用之前被定義,*除非*是下面兩個例子中函數是有條件被定義時。
當一個函數是有條件被定義時,必須在調用函數*之前*定義。
**Example #2 有條件的函數**
```
<?php
$makefoo?=?true;
/*?不能在此處調用foo()函數,
???因為它還不存在,但可以調用bar()函數。*/
bar();
if?($makefoo)?{
??function?foo()
??{
????echo?"I?don't?exist?until?program?execution?reaches?me.\n";
??}
}
/*?現在可以安全調用函數?foo()了,
???因為?$makefoo?值為真?*/
if?($makefoo)?foo();
function?bar()
{
??echo?"I?exist?immediately?upon?program?start.\n";
}
?>
```
**Example #3 函數中的函數**
```
<?php
function?foo()
{
??function?bar()
??{
????echo?"I?don't?exist?until?foo()?is?called.\n";
??}
}
/*?現在還不能調用bar()函數,因為它還不存在?*/
foo();
/*?現在可以調用bar()函數了,因為foo()函數
???的執行使得bar()函數變為已定義的函數?*/
bar();
?>
```
PHP 中的所有函數和類都具有全局作用域,可以定義在一個函數之內而在之外調用,反之亦然。
PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數。
> **Note**: 函數名是大小寫無關的,不過在調用函數的時候,使用其在定義時相同的形式是個好習慣。
PHP 的函數支持[可變數量的參數](http://php.net/manual/zh/functions.arguments.php#functions.variable-arg-list)和[默認參數](http://php.net/manual/zh/functions.arguments.php#functions.arguments.default)。參見 [func\_num\_args()](http://php.net/manual/zh/function.func-num-args.php),[func\_get\_arg()](http://php.net/manual/zh/function.func-get-arg.php) 和 [func\_get\_args()](http://php.net/manual/zh/function.func-get-args.php)。
在 PHP 中可以調用遞歸函數。
**Example #4 遞歸函數**
```
<?php
function?recursion($a)
{
????if?($a?<?20)?{
????????echo?"$a\n";
????????recursion($a?+?1);
????}
}
?>
```
> **Note**: 但是要避免遞歸函數/方法調用超過 100-200 層,因為可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視為編程錯誤。
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)