函数用于分隔那些能够完成独立而又明确的任务的代码,使代码更易于阅读,并且允许在每次需要完成同样任务的时候重复使用代码。
一、自定义函数
1、声明自定义函数
function 函数名(参数1,参数2,...){
//Do something...
return 返回值
}
- 函数名与变量命名规则基本一样,但是不同的是:函数名不区分大小写
- 函数名最好有意义,建议以动词开头;比如:checkEmail(),getModelName();
- 函数名重名,会报致命错误
- 参数非必须
- 参数类型可以是任何一种PHP类型。但是特定函数通常会要求特定数据类型。
- 函数默认返回NULL;
- 函数的执行没有顺序关系,可以在定义处之前的位置调用
- 可以用return添加返回值,函数遇到return,程序停止执行。
$info = ['看月亮','小甜甜','牛夫人'];
function p($var){
echo '<pre>';
print_r($var);
echo '</pre>';
}
p($info);
系统内置函数在所有PHP脚本中都可以使用,但是自定义函数,只能在它声明的脚本中使用
2、函数的参数
传递参数允许我们获得在函数外面生成的数据将被传入函数中。
- 形参:定义函数时声明的的参数(默认值参数、按值传递参数、按引用传递参数)
- 实参:调用函数的传的参数
2.1、默认值参数
可以给特定的参数指定默认值,在没有提供该参数值得时候,就会把这个默认值自动赋给该参数。
function calcSalesTax ($price,$tax=0.75){
$total = $price + ($price*$tax);
echo "Total cost : $total";
}
calcSalesTax(15.00); //不传$tax
calcSalesTax(15.00, 0.85); //传新的$tax
2.2、按值传递参数
在函数内对参数值得任何修改,在函数外都会被忽略,不会影响到外面原本的参数
function calcSalesTax ($price,$tax){
$total = $price + ($price*$tax);
echo "Total cost : $total";
}
calcSalesTax(15.00, 0.75);//传静态值
$a = 20;
$b = 0.75;
calcSalesTax($a,$b); //传变量
由于PHP是弱类型语言,你完全可以传递任何数据类型的变量,不过有时候会有“惊喜”!
2.3、按引用传递参数
在函数内对内参做的修改也可以体现在函数作用域外。引用传递参数要在参数前加上&符号。
$cost = 100;
$tax = 0.75;
function calcSalesTax (&$cost,$tax){
//$cost经过运算已经发生改变
$cost = $cost + ($cost*$tax);
//更改$tax
$tax += 4;
}
calcSalesTax($cost, $tax);
var_dump($cost,$tax);
2.4、使用类型提示(PHP5+)
类型提示(type hinting),利用这个特性可以强制某个类的对象或为数组。 不支持标量类型。
$info = ['看月亮','小甜甜','牛夫人'];
function p( array $info){
echo '<pre>';
print_r($info);
echo '</pre>';
}
p($info);
3、函数的返回值
关键字"return"将终止函数的执行。
/**
* @desc 获取随机数
* @param int $length 随机字符长度
* @return string $key 指定长度的随机字符
*/
function randomkeys($length)
{
$key = '';
//字符池,可任意修改
$pattern = '1234567890123456789012345678901234567890';
for($i=0;$i<$length;$i++)
{
$key.= $pattern{mt_rand(0,35)}; //生成php随机数
}
return $key;
}
/***********************************************/
//返回数组
function getInfo()
{
return ['看月亮','小甜甜','牛夫人'];
}
list($var1,$var2,$var3) = getInfo();
echo "\"一起{$var1}的时候叫人家{$var2},现在新人胜旧人了,就叫人家{$var3}。\"";
二、变量的作用域
变量的作用域(scope)可以控制变量在哪里可见并且可以用的。
1、局部变量
1、在函数内部声明的变量,叫局部变量,即它只能在函数中用 2、在函数外部的变量,被认为是完全不同的另一个变量 3、函数退出时,其局部变量会自动销毁
1.1、动态变量
函数体内声明的变量,函数执行完变量会被销毁
$i = 0;
function testVar(){
$i++; //这哥们就是
echo $i;
}
testVar();//1
testVar();//1
1.2、静态变量
一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化;函数内使用静态变量关键字static
声明的变量在执行完函数后不会被释放,下一次函数调用仍然生效。
$i = 0;
function testVar(){
static $i;
$i++;
echo $i;
}
testVar();//1
testVar();//2
testVar();//3
2、全局变量
在函数外部声明的变量作用域,变量声明到脚本结束期间都可以用
在函数体内显示声明全局变量:
2.1、通过global关键字
$flag = 123;
function getSum(){
global $flag;
return 100 + $flag;
}
echo getSum();
2.2、使用 $GLOBALS 超全局变量
$flag = 123;
function getSum(){
return 100 + $GLOBALS['flag'];
}
echo getSum();
3、特殊的超级全局变量
特殊的超级全局变量在函数内部和外部都是可见可用
function getIp(){
return $_SERVER['SERVER_NAME'].'--'.$_SERVER['SERVER_ADDR'];
}
变量删除
使用unset($var)
删除变量,它就不在变量指定的作用域中。unset()
在函数中的行为会依赖想要销毁的变量的类型而有所不同;
如果在函数中unset()一个全局变量,则只是局部变量被销毁,而在调用环境中将保持调用unset()之前一样的值。
1、通过global关键字声明一个与全局变量同名的局部变量需先声明后使用(实质上是建立了
引用
关系)此时在函数里面可以修改全局变量的值;unset后引用关系没有了,但外部全局变量依旧存在
$var = 123;
function test(){
global $var; //实质上是建立了`引用`关系
echo $var;
unset($var);//unset后引用关系没有了,但外部全局变量依旧存在
var_dump($var);
}
test();// 123 null
var_dump($var); //123
2、使用超全局数组GLOBALS,此时在函数里面可以修改全局变量的值;unset后外部全局变量也不存在
$name = 'jack';
function ckuser(){
echo $GLOBALS['name'];
$GLOBALS['name'] = '聂哥';
echo $GLOBALS['name'];
unset($GLOBALS['name']);
}
ckuser();
var_dump($name);