天天看點

PHP函數的一些冷知識

函數嵌套

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);
?>      
PHP函數的一些冷知識

類型暗示

預設的,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  
?>