PHP中的函数

函数用于分隔那些能够完成独立而又明确的任务的代码,使代码更易于阅读,并且允许在每次需要完成同样任务的时候重复使用代码。

一、自定义函数

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);