函數嵌套
PHP中函數中可以嵌套定義一個函數,這和C#等語言不一樣。嵌套定義的函數,必須要等到外圍函數運作後,才有效。也就是說,外圍函數的運作,使得系統中重新定義了一個新的函數。
<?php
function a()
{
function b()
{
echo "function b<br>";
}
echo "function a<br>";
}
//b();//無法運作,未定義
a();
b();
?>
一開始如果運作b()。會報錯,因為系統找不到b函數,但是運作a函數後,a中的定義b函數的語句也運作了,是以系統中有了b函數。是以接下來運作b函數也就可以了。
運作結果為:
function a
function b
global變量
這個關鍵字的使用,php開發中都應當很熟悉。在函數中使用全局變量前,都需要加上global标示。事實上,可以了解為global标示的變量是函數外部全局變量的一個别名。使用global關鍵字等價于在 $GLOBALS變量中建立一個對變量的引用。
<?php
$var=100;
function a()
{
global $var;
$var=$var+1;
echo $var."<br/>";
}
a();
echo $var."<br/>";
?>
等價于下面的寫法
<?php
$var=100;
function a()
{
$GLOBALS["var"]=$GLOBALS["var"]+1;
echo $GLOBALS["var"]."<br/>";
}
a();
echo $var."<br/>";
?>
最終都是輸出 101 101
靜态變量
和C#語言不同,PHP的函數中允許有靜态變量,其使用方式和類中的靜态變量類似。
預設參數和可變參數
和C#相同,PHP的函數也支援預設參數和可變參數。概念和C#差不多。
function a($a,$b=100)
{
echo ($a+$b)."<BR>";
}
a(100,10);
a(100);
PHP的函數有時候需要一個不定長度的參數,此時隻需要将函數的參數置空即可。在PHP中,調用函數的時候,輸入的參數比定義的參數還多,是不會報錯的,PHP隻會根據順序取它需要的參數即可。如果PHP輸入的參數比預設的少,則會報錯。PHP中可以通過下面三個内置的方法,獲得參數的資訊。
$array = func_get_args();
$count = func_num_args();
$value = func_get_arg(argument_number);
看個例子就能明白了
<?php
function addall()
{
$array = func_get_args();
echo "參數數組:" ; print_r($array);echo "<br>";
$count = func_num_args();
echo "參數個數:" ;print ($count);echo "<br>";
$sum=0;
for($i=0;$i<$count;$i++)
{
$value = func_get_arg($i);
echo "第 $i 個參數的值是 $value <br>";
$sum+=$value;
}
echo "總和$sum";echo "<br>";
}
addall(100,10,20,13);
?>
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SMXBlcyUDN1gDN3czMx8FN0ETO1MjMvwlNy8CX4AzMxAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.jpg)
類型暗示
預設的,PHP函數中,不需要知道變量的類型。但是在某些場合,我們需要某些函數隻接受特定的類型。那麼需要對該這個函數的參數采取類型暗示。
文法方式和C#定義函數那樣,在參數前面指定參數類型即可。看下面的例子:
<?php
class A{}
class B extends A{}
class C{}
function test (A $a, B $b)
{
}
test(new a,new b); // 可以運作
test(new b,new b); // 可以運作
test(new a,new a); // 報錯
test(new a, new c); // 報錯
?>
如果函數test的定義為function test ($a, $b){},那麼下面的4個調用方法都是可以運作的。
但是一旦指定了參數類型,則最後2個調用會失敗,因為不符合參數類型。
可變函數
類似可變變量那樣,函數名也可以通過變量表示
<?php
function fa ()
{
echo "fa running...<br>";
}
function fb ()
{
echo "fb running...<br>";
}
$f="fa";
$f();//等價于調用fa()
$f="fb";
$f();//等價于調用fb()
?>
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>