在php中 函数的声明发生在语言的编译阶段,而不是执行阶段
在编译阶段,内存中会创建用户动态代码区 该区域保存着可执行代码(包括函数)而在执行阶段(调用函数) 内存会为函数创建执行区域空间,该空间为栈区 保存着函数在执行过程中所用的变量(函数的形参和函数体内定义的变量),当函数运行完毕时,在栈区开辟的运行空间随之消失。函数每次调用都会形成一个栈空间
php中的函数名大小写不敏感 通常使用驼峰法编写函数名
可变函数:函数的函数名可以由一个变量来充当 ,例如
function star(){
var_dump("star")
}
$func_name='star';
$func_name();//输出star
1 函数传参问题
(1) 引用传递方法:在形参前面加入地址符(&)
function star(&$para1,&$para2){
//函数体
}
有时 为了保证函数在用户传递的参数不正确或者参数存在经常性的操作时,需要为函数的某些参数设置默认值。例如
function f3($p1,$p2=30){
echo $p1+$p2;
}
f3(10);//40
f3(10,20);//30
(2 )形参与实参的数量问题
通常形参和实参的数量应该一致
但是,当形参数量大于实参数量时,函数是可以执行的,但是会出现警告信息(找不到参数)当实参数量大于形参数量的时候,不会影响函数的正常运行
有时,可利用函数实参数量大于形参数量,可以实现函数功能上的重载
例如要实现n数的累加和
function sumAll(){
// 利用php内置函数实现实参的读取 实现功能上的重载
$args=func_get_args();
$sum=0;
for($i=0,$len=count($args);$i<$len;$i++){
$sum+=$args[$i];
}
echo $sum;
}
sumAll(10,20);//30
2 作用域问题
变量只有存在函数时才有作用域 而且只有变量才有作用域问题,常量不存在作用域的问题
在php中 存在两种作用域,即全局作用域(函数外部)和局部作用域(函数内部),而且作用域不重叠(作用域不能互相访问,在函数内不能访问全局变量,在全局中不能访问函数内的变量)
在php中存在9大超全局变量,超全局变量即在全局可用,又在局部可用
对于用户脚本来说,不能定义一个超全局变量的数据,但可以通过将数据作为超全局变量的元素形式将数据变为超全局的,GLOBALS全局数据变量就是专门讲用户的全局数据变为超全局数据的。其实每个PHP的全局变量会自动变为$GLOBALS的一个元素。
$name="php";
var_dump($GLOBALS['name']);//php
$GLOBALS["name"]="javascript";
var_dump($name);//javascript
如果需要在局部范围访问全局变量,可将局部变量作为超全局变量的数据
function test1(){
var_dump($GLOBALS["name"]);
}
test1();<span style="font-family: Arial, Helvetica, sans-serif;">//javascript</span>
3 静态局部变量
静态局部变量保存在内存中的静态区(保存着静态变量和全局变量)可以保证变量的作用域为所有的该环境的执行周期内 静态变量使用static声明即可
function test2(){
static $count=0;
echo $count++;//计函数被调用的次数
}
test2();//1
test2();//2