用戶自定義函數(shù)

一個函數(shù)可由以下的語法來定義:

示例 #1 展示函數(shù)用途的偽代碼

<?php
function foo($arg_1$arg_2/* ..., */ $arg_n)
{
    echo 
"Example function.\n";
    return 
$retval;
}
?>

任何有效的 PHP 代碼都有可能出現(xiàn)在函數(shù)內(nèi)部,甚至包括其它函數(shù)和 定義。

函數(shù)名和 PHP 中的其它標(biāo)識符命名規(guī)則相同。有效的函數(shù)名以字母或下劃線打頭,后面跟字母,數(shù)字或下劃線。可以用正則表達(dá)式表示為: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。

小技巧

請參見用戶空間命名指南

函數(shù)無需在調(diào)用之前被定義,除非 是下面兩個例子中函數(shù)是有條件被定義時。

當(dāng)一個函數(shù)是有條件被定義時,必須在調(diào)用函數(shù) 之前 定義。

示例 #2 有條件的函數(shù)

<?php

$makefoo 
true;

/* 不能在此處調(diào)用foo()函數(shù),
   因為它還不存在,但可以調(diào)用bar()函數(shù)。*/

bar();

if (
$makefoo) {
  function 
foo()
  {
    echo 
"I don't exist until program execution reaches me.\n";
  }
}

/* 現(xiàn)在可以安全調(diào)用函數(shù) foo()
   因為 $makefoo 值為真 */

if ($makefoofoo();

function 
bar()
{
  echo 
"I exist immediately upon program start.\n";
}

?>

示例 #3 函數(shù)中的函數(shù)

<?php
function foo()
{
  function 
bar()
  {
    echo 
"I don't exist until foo() is called.\n";
  }
}

/* 現(xiàn)在還不能調(diào)用 bar() 函數(shù),因為它還不存在 */

foo();

/* 現(xiàn)在可以調(diào)用 bar() 函數(shù)了,因為 foo() 函數(shù)
   的執(zhí)行使得 bar() 函數(shù)變?yōu)橐讯x的函數(shù) */

bar();

?>

PHP 中的所有函數(shù)和類都具有全局作用域,可以定義在一個函數(shù)之內(nèi)而在之外調(diào)用,反之亦然。

PHP 不支持函數(shù)重載,也不可能取消定義或者重定義已聲明的函數(shù)。

注意: AZ 的 ASCII 函數(shù)名是大小寫無關(guān)的,不過在調(diào)用函數(shù)的時候,使用其在定義時相同的形式是個好習(xí)慣。

PHP 的函數(shù)支持 可變數(shù)量的參數(shù)默認(rèn)參數(shù)。參見 func_num_args(),func_get_arg()func_get_args()

在 PHP 中可以調(diào)用遞歸函數(shù)。

示例 #4 遞歸函數(shù)

<?php
function recursion($a)
{
    if (
$a 20) {
        echo 
"$a\n";
        
recursion($a 1);
    }
}
?>

注意: 但是要避免遞歸函數(shù)/方法調(diào)用超過 100-200 層,因為可能會使堆棧崩潰從而使當(dāng)前腳本終止。 無限遞歸可視為編程錯誤。