## 基本語法
php的標記使用`<?php ?>` 也可以使用`<? ?>` (需要打開短標簽) 建議使用前者
> 文件末尾的 PHP 代碼段結束標記可以不要,有些情況下當使用?[include](http://php.net/manual/zh/function.include.php)?或者?[require](http://php.net/manual/zh/function.require.php)?時省略掉會更好些,這樣不期望的空白符就不會出現在文件末尾,之后仍然可以輸出響應標頭。在使用輸出緩沖時也很便利,就不會看到由包含文件生成的不期望的空白符
```php
<?php
echo "hello";
```
PHP 支持 C,C++ 和 Unix Shell 風格(Perl 風格)的注釋
`#` 開頭的注釋 `// ` 開頭的注釋,` /**/` 段落注釋
```php
<?php
// 行內注釋
# 行內注釋
/*
段落注釋
*/
?>
```
## 數據類型
四種標量類型:
- [boolean](http://php.net/manual/zh/language.types.boolean.php)(布爾型)
- [integer](http://php.net/manual/zh/language.types.integer.php)(整型)
- [float](http://php.net/manual/zh/language.types.float.php)(浮點型,也稱作?[double](http://php.net/manual/zh/language.types.float.php))
- [string](http://php.net/manual/zh/language.types.string.php)(字符串)
三種復合類型:
- [array](http://php.net/manual/zh/language.types.array.php)(數組)
- [object](http://php.net/manual/zh/language.types.object.php)(對象)
- [callable](http://php.net/manual/zh/language.types.callable.php)(可調用)
最后是兩種特殊類型:
- [resource](http://php.net/manual/zh/language.types.resource.php)(資源)
- [NULL](http://php.net/manual/zh/language.types.null.php)(無類型)
### 1.布爾類型 Boolean
布爾類型只有true和false兩個值
以下的值會認為是false。其他之外的都是true
- [布爾](http://php.net/manual/zh/language.types.boolean.php)值?**FALSE**?本身
- [整型](http://php.net/manual/zh/language.types.integer.php)值 0(零)
- [浮點型](http://php.net/manual/zh/language.types.float.php)值 0.0(零)
- 空[字符串](http://php.net/manual/zh/language.types.string.php),以及[字符串](http://php.net/manual/zh/language.types.string.php)?"0"
- 不包括任何元素的[數組](http://php.net/manual/zh/language.types.array.php)
- 特殊類型?[NULL](http://php.net/manual/zh/language.types.null.php)(包括尚未賦值的變量)
- 從空標記生成的?[SimpleXML](http://php.net/manual/zh/ref.simplexml.php)?對象
```php
var_dump((bool)'false') //true #字符串false
var_dump((bool) false) //false #布爾值false
```
### 2. 整型int
整型值可以使用十進制,十六進制,八進制或二進制表示,前面可以加上可選的符號(- 或者 +)
自 PHP 4.4.0 和 PHP 5.0.5后,整型最大值可以用常量?**PHP_INT_MAX**?來表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量?**PHP_INT_MIN**?
```php
123
-123
0123 #八進制
0x123 #十六進制
```
給定的一個數超出了?[integer](http://php.net/manual/zh/language.types.integer.php)?的范圍,將會被解釋為?[float](http://php.net/manual/zh/language.types.float.php)。同樣如果執行的運算結果超出了?[integer](http://php.net/manual/zh/language.types.integer.php)?范圍,也會返回?[float](http://php.net/manual/zh/language.types.float.php)
從其他類型轉換成整型
- 布爾值轉整型 **false** 產生 0 **true** 產生 1
- 從浮點型轉換 向下取整 0.5 轉換成 0
- 字符串轉整型
> 如果該字符串沒有包含 '.','e' 或 'E' 并且其數字值在整型的范圍之內(由?**PHP_INT_MAX**?所定義),該字符串將被當成?[integer](http://php.net/manual/zh/language.types.integer.php)?來取值。其它所有情況下都被作為?[float](http://php.net/manual/zh/language.types.float.php)?來取值。該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為 0(零)。合法數值由可選的正負號,后面跟著一個或多個數字(可能有小數點),再跟著可選的指數部分。指數部分由 'e' 或 'E' 后面跟著一個或多個數字構成
```php
bob3+1 //1
3bob+1 //4
```
### 3. 浮點數float
浮點數,也就是我們說的小數。由于浮點數的精度有限。盡管取決于系統,PHP 通常使用 IEEE 754 雙精度格式,則由于取整而導致的最大相對誤差為 1.11e-16
**永遠不要比較兩個浮點數的值**
### 4.字符串string
字符串由一些字符組成。字符串有四種表示方法
- 單引號
單引號是最簡單的表示方法。在C語言中 單個字符用單引號表示。單引號的變量不解析.表達一個單引號自身,需在它的前面加個反斜線(*\*)來轉義
```php
$a = 'abc';
$b = '$a';//$a
$c = "$a"; //abc
```
?
- 雙引號
雙引號非轉義任何其它字符都會導致反斜線被顯示出來。\*\\{$var}*?中的反斜線還不會被顯示出來。
- heredoc
heredoc 結構是一種提供一個開始標記和一個結束標記。方便書寫大段的字符串。結束標記必須**頂格寫**。
類似雙引號。單引號不轉義。變量解析
```php
<?php
$heredoc = <<<START
FDSFDSFS
SDFSDTHIS DDSFS
任意字符
SF
START
?>
```
?
- nowdoc
Nowdoc 結構是類似于單引號字符串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作 nowdoc前需要加上單引號。
```php
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
```
?
string中的字符可以通過一個從 0 開始的下標,用類似?array結構中的方括號包含對應的數字來訪問和修改
**字符串的鏈接**
字符串的連接使用.(點)
轉成字符串
布爾值 true轉成1 。false 轉成 “”
數組array轉成 "array".object總是被轉換成字符串?*"Object"*,
?
### 5. 數組array
php中的數組和C語言中的數組還有區別。它是一種hash 的類型。通過key=>value.通過數組可以實現豐富的數據類型,如字典、列表、集合、棧等。
定義數組
```php
$arr = array(1,2,3);
//簡寫 php5.4+
$arr2 = [1,2,3];
$arr2[1];
$arr3 = ["key"=>"value"];
$arr3["key"];
```
PHP 將自動使用之前用過的最大?INT鍵名加上 1 作為新的鍵名.PHP 實際并不區分索引數組和關聯數組。
### 6. 對象object
創建一個新的對象的時候,使用new 關鍵字
```
class obj {}
$a = new obj();
```
### 7.資源類型resource
資源類型是保持外部的一個引用。如數據庫的鏈接,文件的句柄等。
```php
$fp = fopen("./a.log");//resource
```
### 8. NULL類型
當一個變量沒有被賦值,那么該變量的值就是null。以下的情況是一個變量被認為是null
- 被賦值成null
- 未賦值
- 被unset
```php
$a = null // null
$b;//var_dump($b); null
$c = 1;
unset($c);//var_dump($c); null
```
### 9. 回調 callback
```php
function test(){
echo "echo";
}
call_user_function('test');
```
## 變量
php中的變量是以 `$` 開頭的。變量名區分大小寫。合法的變量名是字母或者下劃線開頭,后面跟著任意數量的字母,數字,或者下劃線
在此所說的字母是 a-z,A-Z,以及 ASCII 字符從 127 到 255(*0x7f-0xff*)
變量默認總是傳值賦值
```php
$a $_a $張三 // 合法的
$2aaa //非法的
$a = 123;
```
### 變量的作用域
在最外層定義的是全局變量。在全局都有效。在函數內部的成為局部變量。只有函數內部可以訪問。使用static修飾的變量,是靜態變量。靜態變量不會被銷毀。只有等程序運行結束后才被回收.
**$this 是一個特殊的變量。不能定位成this變量**
```php
<?php
$a = 123;//全局
function f1(){
$b = 234;//局部變量
}
echo $b;//未定義
function f2(){
global $a;
echo $a;
}
f2();// 123;
function s(){
static $c = 1;
$c++;
}
s();//2
s();//3
?>
```
確定變量的類型。php提供了以下函數
```php
gettype() is_bool() is_string() is_object() is_array();
```
## 常量
常量一般是定義之后不能再更改的變量。傳統上使用大寫字母來定義常量.合法的常量命名跟變量一致。只是不需要加 `$` 符號。
```php
IS_DEBUG;
define("IS_DEBUG",0);
```
#### 魔術常量
魔術常量是php內置的。可能跟著代碼的變化而變化。一般魔術常量 以雙下劃線開始 雙下劃線結束。
```php
__LINE__
__DIR__
__FILE__
__CLASS__
```
## 表達式
最精確的定義一個表達式的方式就是“任何有值的東西”。最簡單的表達式。常量和變量。
```php
$a;
;// 空表達式
$a = 1;//賦值表達式
function f(){} //函數表達式
$a>1 //比較表達式
```
## 運算符
運算符就是通過一個或者多個符號產生另外一個結果的符號。常見的有加減乘除等
### 運算符優先級
運算符是有優先級的,優先級的先結合。
| 結合方向 | 運算符 | 附加信息 |
| ----- | ---------------------------------------- | ---------------------------------------- |
| 無 | clone new | [clone](http://php.net/manual/zh/language.oop5.cloning.php)?和?[new](http://php.net/manual/zh/language.oop5.basic.php#language.oop5.basic.new) |
| 左 | *[* | [array()](http://php.net/manual/zh/function.array.php) |
| 右 | **\** | [算術運算符](http://php.net/manual/zh/language.operators.arithmetic.php) |
| 右 | *++*?*--*?*~*?*(int)*?*(float)*?*(string)*?*(array)*?*(object)*?*(bool)*?*@* | [類型](http://php.net/manual/zh/language.types.php)和[遞增/遞減](http://php.net/manual/zh/language.operators.increment.php) |
| 無 | *instanceof* | [類型](http://php.net/manual/zh/language.types.php) |
| 右 | *!* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | ***?*/*?*%* | [算術運算符](http://php.net/manual/zh/language.operators.arithmetic.php) |
| 左 | *+*?*-*?*.* | [算術運算符](http://php.net/manual/zh/language.operators.arithmetic.php)和[字符串運算符](http://php.net/manual/zh/language.operators.string.php) |
| 左 | *<<*?*>>* | [位運算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 無 | *<*?*<=*?*>*?*>=* | [比較運算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 無 | *==*?*!=*?*===*?*!==*?*<>*?*<=>* | [比較運算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 左 | *&* | [位運算符](http://php.net/manual/zh/language.operators.bitwise.php)和[引用](http://php.net/manual/zh/language.references.php) |
| 左 | *^* | [位運算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 左 | *\|* | [位運算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 左 | *&&* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *\|\|* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *??* | [比較運算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 左 | *? :* | [ternary](http://php.net/manual/zh/language.operators.comparison.php#language.operators.comparison.ternary) |
| right | *=*?*+=*?*-=*?**=*?**\*=*?*/=*?*.=*?*%=*?*&=*?*\|=*?*^=*?*<<=*?*>>=* | [賦值運算符](http://php.net/manual/zh/language.operators.assignment.php) |
| 左 | *and* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *xor* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *or* | [邏輯運算符](http://php.net/manual/zh/language.operators.logical.php) |
```php
3+2*4// 11
5/3 // 1.33333
5%2 //2
```
- 除法運算符總是返回浮點數.
- 取模運算符的操作數在運算之前都會轉換成整數(除去小數部分)
### 遞增、遞減
| ++$a | 前加 | $a?的值加一,然后返回?$a。 |
| ---- | ---- | ------------------ |
| $a++ | 后加 | 返回?$a,然后將?$a?的值加一。 |
| --$a | 前減 | $a?的值減一, 然后返回?$a。 |
| $a-- | 后減 | 返回?$a,然后將?$a?的值減一。 |
```php
$a = 1;
echo $a++;//1
$b = 1;
echo ++$b;
$c = 'A';
echo ++$c;//B
$bool = false;
$bool++;
var_dump($bool); //false;
```
- 處理字符變量的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的
- 字符變量只能遞增,不能遞減,并且只支持純字母(a-z 和 A-Z)
- **遞增或遞減布爾值沒有效果。**
### 位運算
| **\$a \&\ $b** | And(按位與) | 將把?$a?和?$b?中都為 1 的位設為 1。 |
| -------------- | --------------- | ---------------------------------- |
| **$a \|\$b** | Or(按位或) | 將把?$a?和?$b?中任何一個為 1 的位設為 1。 |
| **$a ^ \$b** | Xor(按位異或) | 將把?$a?和?$b?中一個為 1 另一個為 0 的位設為 1。 |
| **~ \$a** | Not(按位取反) | 將?$a?中為 0 的位設為 1,反之亦然。 |
| **\$a << \$b** | Shift left(左移) | 將?$a?中的位向左移動?$b?次(每一次移動都表示“乘以 2”)。 |
| **\$a >> \$b** | Shift right(右移) | 將?$a?中的位向右移動?$b?次(每一次移動都表示“除以 2”)。 |
### 比較運算符
| $a == $b | 等于 | **TRUE**,如果類型轉換后?$a?等于?$b。 |
| --------------- | :-----------: | :--------------------------------------- |
| $a === $b | 全等 | **TRUE**,如果?$a?等于?$b,并且它們的類型也相同。 |
| $a != $b | 不等 | **TRUE**,如果類型轉換后?$a?不等于?$b。 |
| $a <> $b | 不等 | **TRUE**,如果類型轉換后?$a?不等于?$b。 |
| $a !== $b | 不全等 | **TRUE**,如果?$a?不等于?$b,或者它們的類型不同。 |
| $a < $b | 小與 | **TRUE**,如果?$a?嚴格小于?$b。 |
| $a > $b | 大于 | **TRUE**,如果?$a?嚴格大于?$b。 |
| $a <= $b | 小于等于 | **TRUE**,如果?$a?小于或者等于?$b。 |
| $a >= $b | 大于等于 | **TRUE**,如果?$a?大于或者等于?$b。 |
| $a <=> $b | 太空船運算符(組合比較符) | 當$a小于、等于、大于$b時 分別返回一個小于、等于、大于0的[integer](http://php.net/manual/zh/language.types.integer.php)?值。 PHP7開始提供. |
| $a ?? $b ?? \$c | NULL 合并操作符 | 從左往右第一個存在且不為?**NULL**?的操作數。如果都沒有定義且不為?**NULL**,則返回?**NULL**。PHP7開始提供。 |
如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被[轉換為**數值**]并且比較按照數值來進行.
由于浮點數?**float**的內部表達方式,不應比較兩個浮點數**float**是否相等。
```php
$a = 'abc';
$a == 1;//false
$a = 0;
$b = 'abc';
$a == $b;//true;
```
### 執行運算符
PHP 支持一個執行運算符:反引號(``)。注意這不是單引號!PHP 將嘗試將反引號中的內容作為 shell 命令來執行,并將其輸出信息返回
```php
`ls /home/`
```
### 邏輯運算符
| \$a and $b | And(邏輯與) | **TRUE**,如果?$a?和?$b?都為?**TRUE**。 |
| ------------ | --------- | --------------------------------------- |
| \$a or \$b | Or(邏輯或) | **TRUE**,如果?$a?或?$b?任一為?**TRUE**。 |
| \$a xor \$b | Xor(邏輯異或) | **TRUE**,如果?$a?或?$b?任一為?**TRUE**,但不同時是。 |
| ! $a | Not(邏輯非) | **TRUE**,如果?$a?不為?**TRUE**。 |
| \$a && $b | And(邏輯與) | **TRUE**,如果?$a?和?$b?都為?**TRUE**。 |
| \$a \|\| \$b | Or(邏輯或) | **TRUE**,如果?$a?或?$b?任一為?**TRUE**。 |
```php
$a = (true || false);
```
### 字符串連接符
字符串連接符號 點(.)
```php
$a = 1;
$b = 222
echo $a . $b; //1222
```
### 類型運算符
*instanceof*?用于確定一個 PHP 變量是否屬于某一類
```php
$c = new C();
$c instanceof C;
```
### if else
```php
if($a) {
}
if($a == 1) {
} else{
}
if($a == 1) {
echo '1';
}else if($a == 2) {
echo '2';
}else{
echo 'other';
}
#簡寫 不推薦
if ($a == 1):
echo "1";
else:
echo "else";
endif;
```
### switch
*switch*?語句類似于具有同一個表達式的一系列?*if*?語句。很多場合下需要把同一個變量(或表達式)與很多不同的值比較,并根據它等于哪個值來執行不同的代碼.**每個case分支的break不能省去,如果省去,則會往下執行**
```php
if($a == 1) {
echo '1';
}else if($a == 2) {
echo '2';
}else{
echo 'other';
}
# swtich
switch ($a) {
case 1:
echo '1';
break;
case 2:
echo '2';
break;
default:
echo 'othre';
break;
}
```
### while 、do while
*while*?循環是 PHP 中最簡單的循環類型.只要表達式是true是一直執行,直到條件為false為止.
*do-while*?循環和?*while*?循環非常相似,區別在于表達式的值是在每次循環結束時檢查而不是開始時。和一般的?*while*?循環主要的區別是?*do-while*的循環語句保證會執行一次(表達式的真值在每次循環結束后檢查)
```php
$a = 10;
while($a>1) {
echo $a--;//1098765432
}
#do while
$b = 1;
do{
echo $b; //1
}while($b>1)
```
### for、foreach
*for*?循環是 PHP 中最復雜的循環結構。它的行為和 C 語言的相似
```
for (expr1; expr2; expr3)
statement
```
第一個表達式(expr1)在循環開始前無條件求值(并執行)一次。
expr2?在每次循環開始前求值。如果值為?**TRUE**,則繼續循環,執行嵌套的循環語句。如果值為?**FALSE**,則終止循環。
expr3?在每次循環之后被求值(并執行)。
```php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
//每次都計算count 代碼執行慢 可以使用中間變量
$count = count($people);
for($i = 0; $i < $count; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
```
*foreach*?語法結構提供了遍歷數組的簡單方式。*foreach*?僅能夠應用于數組和對象
```php
foreach($array as $key=>$value) {
}
# 簡寫
foreach($array as $key=>$value):
endforeach;
#引用修改 數組最后一個元素的 $value 引用在 foreach 循環之后仍會保留。建議使用 unset() 來將其銷毀。
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
unset($value);
```
### break 、continue
*break*?結束當前?*for*,*foreach*,*while*,*do-while*?或者?*switch*?結構的執行。break后面可以跟一個數字。表示跳出幾重循環
```php
for($i = 0; $i < 10; $i++) {
if($i==5){
break;
}
echo $i;
}
//01234
for($i=0;$i<10;$i++) {
for($j=0;$j<5;$j++) {
if($j == 2) {
break 2; #跳出兩層循環
}
}
}
```
***continue***?在循環結構用用來跳過本次循環中剩余的代碼并在條件求值為真時開始執行下一次循環
***continue***?接受一個可選的數字參數來決定跳過幾重循環到循環結尾。默認值是?*1*,即跳到當前循環末尾
```php
for($i = 0; $i < 10; $i++) {
if($i==5){
continue;
}
echo $i;
}
// 012346789
```
### declare
*declare*?結構用來設定一段代碼的執行指令。*declare*?的語法和其它流程控制結構相似
目前只認識兩個指令:*ticks* encoding
Tick(時鐘周期)是一個在?*declare*?代碼段中解釋器每執行?N?條可計時的低級語句就會發生的事件。N?的值是在?*declare*?中的?*directive*?部分用`ticks=N`?來指定的
?encoding 指令來對每段腳本指定其編碼方式。
```php
declare(ticks=1);
// A function called on each tick event
function tick_handler()
{
echo "tick_handler() called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
declare(encoding='ISO-8859-1');
```
### return
在函數中使用return 將結束函數的執行。
?**return**?是語言結構而不是函數,因此其參數沒有必要用括號將其括起來。通常都不用括號,實際上也應該不用,這樣可以降低 PHP 的負擔。
```php
function f(){
return 1;
echo '11';//不會執行
}
#a.php
<?php
include("b.php");
echo "a";
?>
#b.php
<?php
echo "b";
return;
?>
// ba
```
### include 、require
include(path) 會按照給定的參數 進行查找,如果沒有找到就到include_path中查找。如果還沒有找到,那么就會拋出一個警告。
如果定義了路徑——不管是絕對路徑(在 Windows 下以盤符或者?*\*?開頭,在 Unix/Linux 下以?*/*?開頭)還是當前目錄的相對路徑。include_path就會被忽略。
require 和include查找文件基本上一致。只是require會拋出一個error錯誤終止代碼的執行。
require 和include是一個語言構造器而不是一個函數
```php
include 'a.php';
echo "hello";
# 會輸出hello
require 'a.php';
echo "hello";
# 拋出一個error hello不會輸出。
```
### include_once 、require_once
*include_once* 、require_once?語句在腳本執行期間包含并運行指定文件.如果該文件中已經被包含過,則不會再次包含
include_once 會拋出warning 。require_once 會拋出error
### goto
goto操作符并不常用。用來跳轉程序的一個位置。目標位置只能位于同一個文件和作用域
無法跳出一個函數或類方法,也無法跳入到另一個函數。也無法跳入到任何循環或者 switch 結構中
```php
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
```
## 函數
函數是將特定的代碼放到一個區間里,方便下次的調用。
函數名和 PHP 中的其它標識符命名規則相同。有效的函數名以字母或下劃線打頭,后面跟字母,數字或下劃線。
PHP 中的所有函數和類都具有全局作用域。PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數。
函數名是大小寫無關的
要避免遞歸函數/方法調用超過 100-200 層,因為可能會使堆棧崩潰從而使當前腳本終止
```php
function 函數名字(參數){
//函數體
}
```
### 函數參數
可以通過參數傳遞外部的信息到函數內部。
支持引用傳遞參數、默認參數
```php
$a = 100;
function fn($arg) {
echo $arg;
}
fn($a);//100
#引用傳遞
function fn(&$arg){
$arg = 10;
}
fn($a);
echo $a;//10;
# 默認值
$a = 100;
function fn($arg = 10){
echo $arg;
}
fn($a);//100
fn();//10
```
#### **類型聲明**
類型聲明允許函數在調用時要求參數為特定類型。 如果給出的值類型不對,那么將會產生一個錯誤
目前支持的類型有類名、接口名、self、array、callable、bool、int、float、string
```php
function fn(int $a){
echo $a;
}
$c = "hello";
fn($c);//error
```
#### **嚴格類型**
默認情況下,如果能做到的話,PHP將會強迫錯誤類型的值轉為函數期望的標量類型
但是在嚴格模式下,php不會轉換。
```php
declare(strict_types=1);
function fn(int $a){
echo $a;
}
$c = '1';//string
fn($c);//
```
#### **可變參數**
PHP 在用戶自定義函數中支持可變數量的參數列表。在 PHP 5.6 及以上的版本中,由?*...*?語法實現
```php
function fn(...$arg){
foreach($arg as $v){
echo $v;
}
}
fn(1,2,3,4);
```
### 返回值
函數的返回值可以通過return 返回。
```php
function fn(){
return "hello";
}
```
#### 返回值類型
可以限制返回值的類型
```php
declare(strict_types=1);
function($a):float {
return 1.1;
}
```
### 可變函數
PHP 支持可變函數的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它。可變函數可以用來實現包括回調函數
```php
function f(){
echo "1";
}
$a = 'f';
$a();//1
```
### 匿名函數
匿名函數(Anonymous functions),也叫閉包函數(*closures*),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數 參數的值。當然,也有其它應用的情況。
閉包可以從父作用域中繼承變量。 任何此類變量都應該用?*use*?語言結構傳遞進去
```php
(function (){
echo '匿名函數';
})();
#傳遞參數
$a = function ($arg) {
echo $arg;
}
$arg = 'hello';
$a($arg);//hello;
# 傳遞外部作用域變量
$arg = 'arg';
$f = function() use($arg){
echo $arg;
}
$f();
```
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法