## 函数
* 为完成某一功能的程序的集合。
* 一个函数在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返回值返回给调用者
调用一个函数,程序会开辟一个新栈
![](https://box.kancloud.cn/d799c929177d9453a4bf2bbf21814039_664x455.png)
### 函数的递归
![](https://box.kancloud.cn/c706c27e18edb7020ee05070696161ed_716x254.png)
### 函数细节
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;
~~~
![](https://box.kancloud.cn/734b66062a6bca19012eb274ef9330e3_281x194.png)
按引用传递:
~~~
$a=100;
function abc(&$b){
$b=123;
echo $b;
}
abc($a);
echo $a; //123
~~~
![](https://box.kancloud.cn/850fb41dd0996718dc9fb03e05be9f7e_535x178.png)
函数中的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
~~~
### 常用的系统函数