函数的自定义

函数:函数的作用就是完成某一特定功能的代码段

1、自定义函数

  function 函数名称(参数){

    函数体

  }

  注意:

    函数名称最好以动词开头;

    函数名称不区分大小写,调用时保持名称一致;

    函数不支持重载,已定义过的函数不可以再以相同命名重新定义;

    函数名称不能和系统函数重名;

  用于检测函数:

    get_defined_functions():得到系统函数和当前脚本中用户自定义的函数的名称,返回的是二维数组

    function_exists($functionName):检测函数名称是否存在,如果存在,返回为真;不存在返回为假

    func_get_args():获取自定义函数的所有实际参数,返回为数组

    func_get_arg(#):获取某一个实际参数的值

    func_num_args():获取实际参数的个数

    例:

      function sum(){

        //echo func_num_args();

        //echo func_get_arg(0);

        $sum=0;

        for($i=0,$j=func_num_args();$i<$j;$i++){

          $sum+=func_get_arg($i);

        }

        return $sum;

      }

      echo sum(1,10,2,20);

2、函数的工作原理

  函数声明之后,不调用的情况下不执行;

  调用函数通过函数名称();

3、封装函数的好处

  代码重用

4、函数的参数

  自定义函数可以没有参数;如果有参数,分为:必选参数和可选参数

  必选参数在调用的时候一定要传值

  可选参数在调用的时候可以不传值,不传值的情况下就使用默认值,传值的时候使用所传的值

  必选参数一定要在可选参数之前

5、函数的返回值

  函数可以有返回值也可以没有

  return 值;

  值可以是任意类型

  当函数执行函数体的时候,碰到return就立即结束,或者执行到函数末尾的时候就结束

6、函数中声明的变量为局部变量,局部变量在函数体内有效,当函数执行完毕之后就被释放了

  函数体外声明的变量是全局变量,但在函数体内想用该全局变量时

    方法一:global $a,$b...;  //定义下变量,声明变量是一个全局变量

    方法二:$GLOBALS["键名"]  --通过下标来取值

    例:

      $i=1;
      $j=1;
      function var_global(){
          global $i;
          echo $i+=1;
          echo "<hr>";
          echo $j;
      }
      var_global();  //$i+=1;会正常输出为2,$j因为未在函数内声明,会报错

  局部变量=动态变量+静态变量

  静态变量:在函数体内通过 static 声明变量为静态变量

    第一次调用的时候去声明,当函数体执行结束后会将这个变量的值保存在静态内存中,当你再次调用的时候,首先会将保存在静态内存中的值取出来再去用

    例:

      function var_static(){
          static $i=1;
          $j=1;
          echo $i+=1;
          echo "<br>";
          echo $j+=1;
          echo "<br>";
      }
      var_static();  //2 2
      var_static();  //3 2
      var_static();  //4 2

7、递归函数、变量函数、回调函数

  递归函数:函数体自己调用自己本身,用途:在遍历文件目录函数库时用到;

  变量函数:把函数名称赋给一个变量,当调用变量的时候:$变量名称(),PHP引擎在解析这个变量的时候会先把它当作函数来解析,就是一个等量代换的过程;

  回调函数:把函数名称当作参数传给另一个函数,结合变量函数在函数体内去调用这个函数;

8、函数的传值和传引用

  传值在函数体内对变量操作不会影响变量本身;

  传引用在函数体内对变量操作会影响变量本身,用 &

 

如何调用自定义的函数?

  包含自定义函数所在的文件,以便调用该文件中的各函数

    require("目标文档的URL") / require "目标文档的URL"  (目标文档不存在时,报错并终止程序执行

    include("目标文档的URL") / include "目标文档的URL"  (目标文档不存在时,报错并继续执行下面代码)

    require_once("目标文档的URL")

    include_once("目标文档的URL")

    require_once和include_once仅包含一次,若之前已包含就不再包含

  require()/include()/require_once()/include_once() 也可用于在一个页面中调用另一个页面

 

嵌套函数调用时报错的问题:

  问题一:

    自定义函数A中嵌套包含了自定义函数B,在函数外直接调用函数B,会报函数B未定义的错;在函数外两次及以上调用函数A,会报重定义的错;

  问题二:  

    若分别在两个自定义函数A、B中调用或又自定义了同名函数C,然后在第三个文件中同时引用了自定义函数A和自定义函数B,因这两个自定义函数中同时存在自定义同名函数C,若在第三个文件中同时调用函数A和函数B,会报重定义的错;

function A(){
    echo "i'm functionA,";
    function C(){
        echo "i'm functionC";
    }
    echo "A:";
    C();        
}
function B(){
    echo "i'm functionB,";
    function C(){
        echo "i'm functionC";
    }
    echo "B:";
    C();
}
include "./1.php";
include "./2.php";

//只调用函数A()或只调用函数B()没问题,但同时调用或连续调用2次函数A就会报重复加载的错
A();
A(); B();
//直接调用函数C()就会报函数未定义的错 C();

  解决方式:

    1.将自定义函数C单独拿出来到第三个文件中定义,与引用的函数A和函数B并列引用,在自定义函数A和自定义函数B中直接调用函数C的函数名

function A(){
    echo "i'm functionA,";
    
    echo "A:";
    C();        
}
function B(){
    echo "i'm functionB,";
    
    echo "B:";
    C();
}
include "./1.php";
include "./2.php";

function C(){
    echo "i'm functionC";
}

A();
A();
B();
C();

    2.在嵌套函数外利用 function_exists() 函数加一个条件判断即可

function A(){
    echo "i'm functionA,";
    if(!function_exists("C")){
        function C(){
            echo "i'm functionC";
        }
    }
    echo "A:";
    C();        
}
function B(){
    echo "i'm functionB,";
    if(!function_exists("C")){
        function C(){
            echo "i'm functionC";
        }
    }
    echo "B:";
    C();
}
include "./1.php";
include "./2.php";

A();
A();
B();
C();

 

posted @ 2018-05-09 16:03  Autumn_n  阅读(1000)  评论(0编辑  收藏  举报
TOP