首页 > 代码库 > php学习day7--函数的相关知识

php学习day7--函数的相关知识

  今天我们主要学了函数的相关知识,是个比较基础的知识,但也是很重要的。

一、函数

  函数就类似于一个工具,我们写好函数之后可以直接进行调用,可以很大的减少代码的从用性,提高页面性能和可读性。

  1.函数的定义

  在php中函数的定义方式为:

      function  name($形参1,$形参2.....){

        要执行的代码

        return  123;

      }

  在上方的函数定义式中,name代表函数名,小括号内是形参,是用来传递参数,花括号中的就是调用时需要执行的代码。

  函数的调用方式:

      name(实参1,实参2,......)

  当代码读到name(实参1,实参2,......)时,就会执行上述定义函数中花括号的内容,其中实参就会通过形参传递到函数内部,用来参与运算。花括号中如果有return则函数有返回值,返回值为return后跟的值;

  当调用函数时,如果不进行传递参数,可以给形参设置默认值:

      function name($x=1,$y=2){......}

  当在调用这个函数时,不进行传参,则函数运行中默认$x=1,$y=2;

  2.形参的传值问题:

    值传递:默认的方式,如果没有特别的设定,参数传值都是值传递。

    引用传递:需要在形参的前面加&符号:

技术分享

 

  那么我们来看看以前学过的什么是值传递(拷贝传值)和引用传递:

技术分享

 

  3.函数参数的数量问题

   通常函数调用时的实参数量,应该跟函数定义时的形参数量一致,如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略,注意:省略只能从右往左进行。

  有一种定义和使用函数的特别形式(并不常见):它不定义形参,而实参任意给出,这种函数系统中也经常见到比如:

      ver_dump($v1);

      var_dump($v1,$v2,$v3);

  我们自己也可以定义这种函数:

    在函数内部调用系统函数,func_get_args(),所有的实参数据都会放入一个数组中:

      $arr = func_get_args();     //获取实参数据列表

      func_get_arg($i);      // 获得第$i个实参,$i从零开始

      func_num_args();  //获取是实参的个数   

技术分享

 

二、函数的其他形式

  1.可变函数

  在之前我们学习过可变变量:一个变量的名字还是一个变量。

  与可变变量一样,一个函数的名字也是一个变量;

技术分享

可变变量的运用

技术分享

 

   2.匿名函数

  匿名函数就是指没有名字的函数。匿名函数的形式有两种,

    形式1:将一个匿名函数“赋值”给一个变量。

        $a = function (){

          echo "这是一个匿名函数"

        };       //注意:这里要用分号

        $a();    //函数的调用。

        //匿名参数也可以带参数,也可有返回值,使用和正常函数差不多。

      形式2:将匿名函数当做实参来使用,如下图:

    技术分享

三、函数的作用域

  变量的作用域,就是指:一个变量在什么范围中可以使用的情况。php中作用域有三个分别是局部作用域,超全局作用域,全局作用域;

  1.局部作用域

    就是指一个函数的内部范围。对应的变量就是局部变量。

    局部变量会在函数执行结束时候会将变量销毁,下次调用会还是原来的值。不过有个例外,那就是静态局部变量,在变量名称之前添加static,那么这个变量就不会被销毁。可以用来比如:

        function fn() {

          static $c = 0;   //此时就是静态局部变量,他的值会保留。

        }

    举个例子:

技术分享

 

  2.超全局作用域

    就是指所有的代码范围。对应的变量就是超全局变量。其实只有系统预定义的几个:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES

  3.全局作用域

    就是不在函数内部的范围----函数外部。对应的变量就是全局变量。

   注意:

    1)通常情况下全局范围不能访问局部变量。

技术分享

 

    2)局部范围不能访问全局变量。 技术分享

   那么,如何在局部区域使用全局变量呢?

  1)我们可以在函数中,使用global关键字来声明一个要使用的全局变量的同名局部变量。

技术分享

   需要注意的是:其实函数内部的$v4是局部变量,函数外的$v4是全局变量,两个变量不同,但是指向是相同的(也就是引用关系)

  2)使用$GLOBALS超全局变量,可以认为是全局变量的另一种使用方式。

  技术分享

  但是,如果我们队$GLOBALS变量的某个单元(也就是下标)进行unset,则其就会完全对应销毁,这是因为$GLOBALS对全局变量的使用可以看做是全局变量的另一种语法形式而已,而不是引用关系。如图:

技术分享

四、函数的编程思想

  1.递归思想----递归函数

    递归函数就是一个函数内部调用它自己的函数!

      function fn($n){

        echo $n;

        fn($n);

      }

      fn();

    从上面的这个函数来看,这个函数是死循环,在项目中不能这样使用,我们需要让他按照我们的要求停下来。

  运用递归函数来求n的阶乘;

    function  fn1($n){

      if($n==1){

        return 1;

      }

      $res = $n*fn1($n-1);

    }

    fn1(n);

    递归思想总结:当面对一个大问题时,该大问题可以经由该问题的“小一级问题”而经过简单计算获得,而且,可以获知这类问题的“最小一级问题”答案,则此时就可以用递归思想来解决。

  2.递推(迭代)思想

    递推的思想就是:最小的问题是已经解决,一级一级向上解决,直到解决完问题:

      $a = 1;

      for($n=2;$n<=5;++$n){

        $res = $n*$a;

        $a = $res;

      }

       echo  $res;

    当一个问题既可以用递推和递归同事能解决问题,我们需要优先选用递推思想,因为递归的思想更消耗资源。

    好了,今天的学习就到这里,我们明天继续。

  

php学习day7--函数的相关知识