## 函數
* 為完成某一功能的程序的集合。
* 一個函數在50-100行內比較合理
* 函數可以沒有返回值
**系統函數列表**
~~~
echo '<pre>';
print_r(get_defined_functions());
~~~
### 概念:
1. 提高的代碼的復用性
2. 利于模塊化編程
### 文件引入:
require
require_once
include
include_once
~~~
//3種引用方法
require 'a.php';
require ('a.php');
$ifile='a.php';
require $ifile;
~~~
**區別:**
1. require,require_once 出現錯誤,直接退出;
2. require會重復引入;
3. once會判斷是否引入過,不會重復引入,節省開銷;
5. include 如果文件出錯,雖然報錯,但程序會繼續執行
**推薦使用require和require_once**
#### 引入文件流程
* 引入的文件是先執行完畢后,把結果返回給需要的頁面
* 成功引入一個文件,默認會返回1
* 被引入文件中,含有return,會在需要的頁面返回這個值
* 被引入文件中含有return ,引入過程終止,后面的內容不再執行,繼續執行主文件內容
~~~
//a.php中
return 100;
//index.php中
$a=require 'a.php';
echo $a; //100
~~~
項目開發:
一般用絕對路徑引用
a.獲取網站根目錄
~~~
define('ROOT_PATH',dirname(__DIR__));
~~~
**模板中使用循環**
~~~
<?php foreach($nav as $value):?>
<h1><?php echo $value ?></h1>
<?php endforeach;?>
~~~
### 函數理解
函數可以沒有返回值
return返回值返回給調用者
調用一個函數,程序會開辟一個新棧

### 函數的遞歸

### 函數細節
1. 函數的參數列表可以多個
2. 函數的參數可以是任意類型
3. 函數名和自定義變量一樣,只能是字母和下劃線
4. 函數中定義的變量是局部的,再函數外不生效
5. 函數中使用已經定義好的全局變量,使用global
6. 使用global的時候,如果外面沒有$a,則會自動創建一個全局$a變量
7. 函數靜態變量:一般在函數中定義,存放在數據的靜態區,只會被初始化一次
8. 函數的默認值:傳參的時候指定一個值,實例化的時候,如果不填寫,會用默認值,否則覆蓋默認值
9. 默認情況下,函數按值傳遞,如果希望函數的參數修改外部的變量,必須通過引用傳遞&
10. 內部函數:在函數內部聲明一個函數,在外部無法調用,類似JS閉包。只有外部函數執行后,才能使用內部函數
11. 可變函數:如果一個變量名后面有圓括號,PHP會自動尋找同名函數,并執行。可以用在回調函數中。
12. 函數的參數可以是函數:
13. 匿名函數:沒有名字的函數,通常作為回調函數用
1. 回調函數:一個函數內部又調用另一個函數,稱為回調函數。
~~~
func_get_args(); //參數列表
func_get_arg(3);
func_num_agrs();//參數個數
~~~
static用法:
~~~
function abc(){
static $a=0; //第二次這句話不執行
$a++;
echo $a;
}
abc(); //1
abc(); //2
~~~
global的用法:
~~~
$a=100;
function abc(){
global $a; //等價于 $a=&$GLOBALS['a'];
$a=123; //外面的$a也會改變
return $a;
}
abc();
echo $a;
~~~

按引用傳遞:
~~~
$a=100;
function abc(&$b){
$b=123;
echo $b;
}
abc($a);
echo $a; //123
~~~

函數中的unset
~~~
$a=100;
function abc(&$b,&$a){
unset($b); //unset是釋放變量,干掉的是$b這個變量,但數據區的值沒有變化
}
abc();
echo $a; //100
~~~
內部函數:
~~~
function calculator($n1,$n2){
function getSum($n1,$n2){
return $n1+$n2;
}
function getSub($n1,$n2){
return $n1-$n2;
}
return getSum($n1,$n2)+getSub($n1,$n2);
}
$res=calculator(3,9);
getSum(2,3); //上面調用過一次,內部函數也會被運行,所以這里可以用
~~~
可變函數:
~~~
function box(){
echo 'abc';
}
$a='box';
$a();
~~~
函數的參數函數:
~~~
function box(){
$a=func_num_args();//參數的總個數
echo $a;
$b=func_get_args();//獲取參數列表
echo "<pre>";
print_r($b);
$c=func_get_arg(2);//返回第幾個參數的值
echo $c;
}
~~~
匿名函數:
用法1:
~~~
$box=function($a,$b){
return $a+$b;
};
echo $box(99,33);
~~~
用法2:匿名函數作為回調函數,只能用一次,用完即結束
~~~
function box($a,$b,$f){
$sum=$a+$b;
echo $res=$f($sum);
};
box(4,3,function($val){
return $val*2;
});
~~~
### 變量作用域:
主要體現在函數中
局部作用域:函數內部有效
全局作用域:函數外可以用,函數內也可用通過global用
超全局作用域:在一個腳本中,所有地方都可以用,PHP預定義的變量
超全局變量:
~~~
$GLOBALS //數組,包含所有變量,預定義的和自己定義的
$SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
~~~
### 常用的系統函數