PHP函式的一些冷知識

技術小甜發表於2017-11-08

函式巢狀

PHP中函式中可以巢狀定義一個函式,這和C#等語言不一樣。巢狀定義的函式,必須要等到外圍函式執行後,才有效。也就是說,外圍函式的執行,使得系統中重新定義了一個新的函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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變數中建立一個對變數的引用。

1
2
3
4
5
6
7
8
9
10
11
<?php
$var=100;
function a()
{
   global $var;
   $var=$var+1;
   echo $var."<br/>";
}
a();
echo $var."<br/>";
?>

等價於下面的寫法

1
2
3
4
5
6
7
8
9
10
<?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#差不多。

1
2
3
4
5
6
function a($a,$b=100)
{
echo ($a+$b)."<BR>";
}
a(100,10);
a(100);

PHP的函式有時候需要一個不定長度的引數,此時只需要將函式的引數置空即可。在PHP中,呼叫函式的時候,輸入的引數比定義的引數還多,是不會報錯的,PHP只會根據順序取它需要的引數即可。如果PHP輸入的引數比預設的少,則會報錯。PHP中可以通過下面三個內建的方法,獲得引數的資訊。

1
2
3
$array = func_get_args();
$count = func_num_args();
$value = func_get_arg(argument_number);

看個例子就能明白了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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);
?>

CA43B887143048948DD3075EB80CB7E8

型別暗示

預設的,PHP函式中,不需要知道變數的型別。但是在某些場合,我們需要某些函式只接受特定的型別。那麼需要對該這個函式的引數採取型別暗示。

語法方式和C#定義函式那樣,在引數前面指定引數型別即可。看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class A{}
class 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個呼叫會失敗,因為不符合引數型別。

可變函式

類似可變變數那樣,函式名也可以通過變數表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function fa ()
{
    echo "fa running...<br>";
}
function fb ()
{
    echo "fb running...<br>";
}
$f="fa";
$f();//等價於呼叫fa()
$f="fb";
$f();//等價於呼叫fb()
?>

匿名函式

和C#中的匿名函式概念一樣,PHP中也有匿名函式的概念,PHP支援通過內建函式來建立函式的功能。根據php手冊上的例子,

1
2
3
4
5
6
7
8
<?php
$newfunc = create_function(`$a,$b``return "ln($a) + ln($b) = " . log($a * $b);`); 
echo "New anonymous function: $newfunc
"
echo $newfunc(2, M_E) . "
"
// outputs 
// New anonymous function: lambda_1 
// ln(2) + ln(2.718281828459) = 1.6931471805599 
?>

$newfunc就類似於c#中的委託型別可以通過它呼叫建立的函式。


本文轉自cnn23711151CTO部落格,原文連結: http://blog.51cto.com/cnn237111/1282642,如需轉載請自行聯絡原作者


相關文章