函数的定义格式
function 函数名(参数1,参数2,n){ // 参数可以不写
执行语句;
return; // 返回值可以不写
}
函数传参方式
传值赋值
<?php
function fun($a){ // $a(内部)=$a(外部) 传值赋值
$a = $a + 1; // $a是函数内部的值,怎么变,和外部的$a无关
echo "内部",$a,"<br>"; // 内部6
}
$a = 5;
fun($a); // 传参$a,相当于把$a(外部)的值,赋给$a(内部)属于传值赋值
echo "外部",$a; // 外部5
引用赋值 :这种传参方式不推荐 破环了函数的封装性
<?php
function fun(&$a){ // $a(内部)=&$a(外部) 引用赋值 指向同一个地址
$a = $a + 1;
echo "内部",$a,"<br>"; // 内部6
}
$a = 5;
fun($a);
echo "外部",$a; // 外部6
函数中变量的作用域
- 在PHP页面中声明的变量,叫"全局变量"
- 在函数内的变量,叫"局部变量"
- 函数内访问全局变量需要 global 关键字(不推荐 破环了函数的封装性)
局部变量$a没有定义 所以报错
// php中局部变量未定义,全局变量定义了,依旧不能使用全局变量
$a = 5;
function fun(){
echo $a; // 报错 函数内部没有定义$a
}
fun();
这里的传值相当于 局部变量中定义了 $a=1 (两个$a只是变量一样罢了 根本无关)
$a = 5;
function fun($a){ // 传值传参 等同于 $a=1 两个$a只是变量名一样 并无关联;
echo $a; // 函数内部定义了$a 所以才能正常打印
}
fun(1);
函数内访问全局变量需要 global 关键字 (不推荐 破环了函数的封装性)
$a = 5;
function fun(){
global $a; // global声明全局变量
echo $a; // 这里$a使用的是全局变量$a的地址
}
fun(); // 5
超级全局变量
在页面的任何部位,包括函数方法等,都可以直接访问
function fun(){
print_r($_GET);
}
fun();
动态调用函数
可以用变量的值当做函数,并调用函数,类似于动态变量名
<?php
function happy(){
echo "哈哈";
}
function sed(){
echo "呜呜";
}
$heart = "happy";
$heart(); // $heart值是happy 因此调用的是happy
递归函数
递归函数即自调用函数,在函数体内部直接或间接的自己调用自己,函数体中会附加一个条件判断,以判断是否需要执行递归调用,并且在特定的条件下终止函数的递归
- 递归函数不一定要 return 视情况而定
- 用递归打印当前目录所有文件 用str_repeat() 实现分级
- 静态变量与递归函数
普通的递归函数
// 递归求1-n的和
function sum($n){
if ($n == 1){
return $n;
}
return $n + sum($n-1);
}
$ret = sum(100);
print_r($ret); // 5050
// 打印当前目录下的所有文件,目录及子目录
function printdir($path, $lev=1){
if (is_dir($path)){
if ($dh = opendir($path)){
while (($file=readdir($dh)) !== false){
echo str_repeat(' ', $lev),$file,'<br>';
if ($file=='.' || $file=='..'){
continue;
}
if (is_dir($path.'/'.$file)){
printdir($path.'/'.$file, $lev+8);
}
}
}
}
}
printdir('.');
静态变量与递归函数
// 静态变量与递归函数
$arr = array(1,2,3,array(4,array(5,6)));
function sum($arr){
static $sum = 0;
foreach ($arr as $value){
if (is_array($value)){
sum($value);
continue;
} // 这里用 else 也可以和 continue 一样效果
$sum += $value;
}
return $sum;
}
echo sum($arr);
全局变量与递归函数
引用赋值与递归函数