PHP函式的一些冷知識
函式巢狀
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); ?> |
型別暗示
預設的,PHP函式中,不需要知道變數的型別。但是在某些場合,我們需要某些函式只接受特定的型別。那麼需要對該這個函式的引數採取型別暗示。
語法方式和C#定義函式那樣,在引數前面指定引數型別即可。看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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個呼叫會失敗,因為不符合引數型別。
可變函式
類似可變變數那樣,函式名也可以通過變數表示
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,如需轉載請自行聯絡原作者
相關文章
- 前端的一些坑,一些記錄,一些冷知識前端
- php的一些函式PHP函式
- JS原生Date型別方法的一些冷知識JS型別
- Python的冷知識Python
- Javascript函式的基本知識JavaScript函式
- 有趣的8個IT冷知識
- PHP程式設計師遇到問題的冷門知識點PHP程式設計師
- PHP開發的一些漏洞安全知識PHP
- 蘋果產品冷知識蘋果
- JavaScript 有趣的冷知識:模板字串JavaScript字串
- JS函式知識點梳理JS函式
- PHP安全有幫助的一些函式PHP函式
- 【知識點】inline函式、回撥函式、普通函式inline函式
- HTTP協議冷知識大全HTTP協議
- Swift 冷門語法知識Swift
- JavaScript 有趣的冷知識:tagged template literalsJavaScript
- PHP 知識PHP
- JS小知識——立即執行函式JS函式
- Python基礎函式使用知識Python函式
- Flutter冷知識 | 獲取dart的print內容FlutterDart
- hive的一些知識Hive
- SAP的一些知識
- 一些小知識
- 初學 PHP 對於回撥函式的一些理解PHP函式
- PHP知識大全PHP
- golang拾遺:內建函式len的小知識Golang函式
- JavaScript陣列、字串、數學函式的知識點JavaScript陣列字串函式
- python,函式各種基礎知識Python函式
- PHP的字串函式PHP字串函式
- 帶你深入理解 Flutter 中的字型“冷”知識Flutter
- 冷知識:數學常數“e”的傳奇故事
- 關於flex-shrink如何計算的冷知識Flex
- 6個冷門但實用的pandas知識點
- Spring 冷知識:一個提前 AOP 的機會Spring
- php函式PHP函式
- PHP 函式PHP函式
- php 函式PHP函式
- 關於一些php面試之物件導向的相關知識PHP面試物件