• 【PHP】最详细PHP从入门到精通(二)——PHP中的函数


     PHP从入门到精通

    之PHP中的函数

       各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持。PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新PHP中的函数知识,为大家带来最详细实用的知识讲解,感谢大家的支持!

       以下为函数的详细知识:

      

    函数的声明和使用

    1、函数名是标识符之一,只能有字母数字下划线,开头不能是数字。

    函数名的命名,须符合"小驼峰法则"  myName my_name 

    函数名不区分大小写func(),FUNC()

    函数名不能与已有函数名重复,不能与系统函数名重复;

    2、function_exists("fun1");用于检测函数是否已声明;

    注意:传入函数名,必须是字符串格式;返回结果为true/false;

    简单函数的声明和调用:

    function func1(){
        echo "函数里面的语句";
    }
    func1();
    FUNC1();
    PHP中函数的作用域

    1、局部变量:声明在函数内部的变量,称为局部变量。只在函数内部能用,函数外如需使用,需在函数中用return关键字返回;

    2、全局变量:声明在函数外部的变量,称为全局变量。

    <函数中使用全局变量的3种方式:>

    3、函数中,使用变量,默认使用全局变量。只在函数外部能用,函数内如需使用,需在函数中用global关键字将变量改为全局变量引入;函数中的变量名如果与全局变量重复,global语句之上的为函数局部变量,global之下的为系统全局变量;

    4、$GLOBALS[""]全局数组:

    $GLOBALS[""]数组,是PHP给我们内置的全局数组,可以直接给数组添加值,无论在函数内外声明,均可在任何地方直接使用;

    5、函数中使用全局变量还有一种方式,:通过给函数传参,可以在函数内部使用过全局变量;

    但是,传递以后的参数是函数的局部变量,内部改变,外部不会变;

    除非,传递的参数是地址function func($a1,&$a2){}//函数内部修改a1,全局a1不变;函数内修改a2,全局a2跟着变;

    如果,函数的形参,出现了取址符号,则,调用函数时,实参必须是变量,而不能是自变量:

    eg上式中:func(1,2)×   func(1,$a2)√

    6、使用require和include包含,不会影响作用域;

    实例展示:

    $a1=10;
    function func(){
        $a1=30;
        echo "0.$a1</br>";//global之上使用局部变量
        $GLOBALS["a3"]=40;
        echo $GLOBALS["a3"]."</br>";//global数组
        global $a1;
        $a2=20;
        
        echo "1.$a1</br>";//global之下使用全局变量
        echo "1.$a2</br>";
        return $a2."</br>";
    }
    $a2=func();    
    
    echo "2.{$a1}</br>";//使用全局变量
    echo "2.{$a2}</br>";//通过return返回,通过变量接受
    echo $GLOBALS["a3"]."</br>";//函数中通过$GLOBALS["a3"]声明,函数外能用。
    静态变量

    1、静态变量使用static关键字声明。

    static $num=0;

    2、静态变量的特点:

    >>>静态变量在函数第一次加载的时候进行声明。

    >>>函数使用完不会立即释放变量,静态变量在整个脚本过程中,只会声明一次。

    >>>同一函数,多次调用,共享一个静态变量。

    实例展示:

    function func(){
        static $num=0;
        $num++;
        echo $num."</br>";
    }
    func();
    func();
    func();
    函数的参数传递

    此处插入一条,需特别注意:在PHP中,设计参数传递时,实参列表只能比形参多,不能比实参少!

    1、常规参数传递:

    2、伪类型参数传递:(详见案例)

    ①通过&引用参数传递,函数内修改变量,函数外同步变化;

    ②形参为引用参数,实参只能是变量,不能是字面量:func(10)×

    3、默认参数的调用:function func($a=10,$b){}  func(,20);//$a可以不传参数,默认是10;$b必须传参数

    >>>如果参数中既有默认参数,又有非默认参数,那么,默认参数列表必须要在非默认参数列表的后面!即调用的时候,必须保证非默认参数的优先赋值。

    4、可变参数列表传递:由于PHP实参可以比形参多,那么我们可以传递N个实参,并通过PHP内置函数取到对应参数。

    func_get_args()//取所有参数列表(数组)

    func_num_args()//返回参数的总个数,相当于count($arr);

    func_get_arg(0)//根据下标,取每个参数;相当于$arr[0];

    实例展示:

    function($a){
        $a+=10;
        return $a;
    }
    echo func(10);
    
    //引用类型的参数传递
    $a=10;
    functionfunc(&$a){
        $a+=10;
    }
    func($a);//通过取址符号,可以直接将传入的$a的值改掉。
    echo $a;
    
    //默认参数
    function func($b,$a=10){
        return $a+$b;
    }  
    echo func(20);
    
    //可变参数列表
    function func(){
        $arr=func_get_args();
        var_dump(func_get_args());//取所有参数列表(数组)
        var_dump(func_num_args());//返回参数的总个数
        //var_dump(count($arr));//同上
        var_dump(func_get_arg(0));//根据下标,取每个参数
        //var_dump($arr[0]);//同上
        $sum=0;
        $count=func_num_args();
        for($i=0;$i<$count;$i++){
            //$sum+=func_get_arg($i);
            $sum+=$arr[$i];
        }
        return $sum;
    }
    echo func(1,2,3,4,5);
    回调函数

    1、使用变量函数,自定义回调函数:

    function($func){$func();}  -->  function f(){} --->  func("f")

    2、使用call_user_func_array和call_user_func自定义回调函数:

    两个函数的第一个参数,均为回调函数,表示执行当前回调;

    不同点在于:前者的第二个参数为数组,并将数组的每个值赋给回调函数的参数列表

     后者的参数列表直接展开写到第2~多个参数中

    实例展示:

    //变量函数
    function func($a){
        echo "Q的前端{$a}";
    }
    $fun="func";
    $fun(10);
    
    //自定义回调函数
    function func($start,$end,$fun){
        //$fun="func";
        //$fun();
        for($i=$start;$i<=$end;$i++){
            if($fun($i)){
                echo "{$i}</br>";
            }
        }
    }
    function filter($num){
        if($num%3!=0){
            return true;
        }else{
            return false;
        }
    }
    func(1,59,"filter");
    
    //使用call_user_func_array和call_user_func自定义回调函数
    function func(){
        $arr = func_get_args()    ;
        $str = "";
        for($i=0;$i<count($arr);$i++){
            $str = $arr[$i];
        }
        return $str;
    }
    
    //相当于apply
    echo call_user_func_array("func", array("杰瑞","教育","HTML5","+","PHP"));
    //相当于执行func函数,并且把数组的每一项作为参数传入
    echo "<br>";
    //相当于call
    echo call_user_func("func","杰瑞","教育","HTML5","+","PHP");
    匿名函数

    由于变量函数在调用时存在多种调用方式(func()/$fun())

     所以为了让函数的调用更加统一,才产生了匿名函数。

      !!!声明匿名函数,函数体后面的分号必不可少!!!

      匿名函数本身也是变量,用var_dump()检测,为Object类型;

    实例展示:

    function func(){}
    func();
    $fun="func";
    $fun();
    $func=function($a){
        echo "这是匿名函数{$a}";
    };
    $func(10);//可以传参
    递归函数

    1、所谓递归,指的是在函数内部执行自身的操作;

     2、递归分为两步:递(类似JS事件捕获)   归(类似JS事件冒泡);

      递:当最外层函数体中,遇到自身函数调用,继续进行内层函数执行。而外层函数的后半部分暂不执行。直到最内层函数执行完后,再逐步向外执行。

    实例展示:

    function func($num){
            echo $num."</br>";
            if(){
                func($num-1);
            }
            echo $num."</br>";
        }
        func(10);

    附图说明:

    include&require

    1、两者的作用,都是引入外部的PHP文件到当前文件夹中;

    2、两者的区别:当引入文件错误时,include会产生警告,并不影响后续代码执行;而require会产生致命错误,后续代码全部不再执行;
    3、一般,当用于在文件最上方导入某些文件时,使用require导入,如果导入失败,则不执行文件;
    而如果是在某些分支条件中,导入某些操作,使用include导入,即使导入失败,不影响后续代码执行;
    4、include_once和require_once表示:文件只能导入一次。如果多次调用函数,则后面的语句会判断文件是否导入,再决定是否导入新文件(效率优化问题,不推荐)
    !!!注意:检测文件时,只关心文件是否导入,并不关心是以何种方式导入的;
    5、include和require可以导入各种类型的文件,相当于在当前文件copy了一份,但是在copy过程中,PHP引擎会进行适当的编译,确保不出现不必要的错误。
    6、include和require是函数,也是指令。PHP对很多常用函数,会提供指令的写法。
    eg:函数写法:echo("11"); 指令写法:echo "11";

    实例展示: 

    include ("funcText.php");
    //require ("funcText.php");//接相对路径
    func1();
    func2();
    func3();
    以下为funcText.php文件中的代码:
    <?php
        header ("Content-Type:text/html; charset=utf-8");
        
    function func1(){
        echo "我是func1</br>";
    }
    function func2(){
        echo "我是func2</br>";
    }
    function func3(){
        echo "我是func3</br>";
    }

    本期分享就到这里,觉得内容不错的小伙伴请点推荐,欢迎大家在评论下方评论区与博主互动,谢谢大家!

    未完,待续。。。

     更多详细内容,敬请关注 Q的前端世界的技术博客。

  • 相关阅读:
    hihoCoder 1148 2月29日
    Java 之常用运算符(3)
    Java 之变量和常量(2)
    Codeforces Round #414 A. Bank Robbery
    Codeforces Round #413 B. T-shirt buying
    C++中 set(集合容器)的用法
    Codeforces Round #411 B. 3-palindrome
    Codeforces Round #411 A. Fake NP
    Codeforces Round #413 A. Carrot Cakes
    Codeforces Round #412 B. T-Shirt Hunt
  • 原文地址:https://www.cnblogs.com/liuyongqi/p/6942996.html
Copyright © 2020-2023  润新知