07-函数

作者: 董泽平 | 来源:发表于2019-10-17 15:08 被阅读0次

    函数

    php的函数类比c语言的函数,扩充了许多种类的函数,我们将一一讨论,下面是这节将会讲到的函数

    • 普通函数
    • 默认值函数
    • 参数变化函数
    • 可变函数(不是参数变化)
    • 回调函数
    • 匿名函数
    • 闭包

    普通函数

    普通函数就是与大多数编程语言一样格式的函数,我们分为有参数,无参数,有返回值,无返回值四类。

    • 无参函数

    格式:

    
        function 名称()
        {
         ...
        }
    
    
    
        function f1()
        {
            echo "i am is a function";
        }
        f1();//i am is a function
    
    
    
    • 有参函数
    
        function 名称(参数1,参数2...参数n)
        {
         ...
        }
    
    
    
        function f1($num1,$num2)
        {
            echo $num1+$num2;
        }
        f1(10,20);//30
    
    
    
    • 无返回值函数
    
        function 名称()
        {
         ...
        }
    
    
    
        function f1()
        {
            echo "i am is a function";
        }
        f1();//i am is a function
    
    
    
    • 有返回值函数
    
        function 名称($num1,$num2,...参数n)
        {
         ...
         return 变量/值
        }
    
    
    
        function f1($num1,$num2)//形参num1 num2
        {
            return $num1+$num2;
        }
        echo f1(10,20);//30,实参10,20
    
    
    

    此处我们再讨论下php函数参数传递的两种格式,一个是值传递,一个是引用传递。

    格式:

    //值传递
    function f1($num)
    {
    
    }
    //引用传递
    function f1(&$num)
    {
    
    }
    

    本质剖析:

    和C语言一样,值传递仅仅是把变量的值传递给函数的形参,形参无论如何操作都不会改变形参,而引用参数传递就是用到前面一节讲的引用的本质就是变量本身,内存共用。所以引用传递的变量,在函数体内被改变,外面的参数值也会改变。

    //值传递
    function f4($num)
    {
        $num += 10;
        return $num;
    }
    $num = 10;
    echo $num;//10
    f4($num);
    echo $num;//10;
    
    
    //引用传递
    function f5(&$num)
    {
        $num += 10;
        return $num;
    }
    $num = 10;
    echo $num;//10
    f5($num);
    echo $num;//20;
    

    默认值函数

    php的默认值函数和C++的也是一样的,规则也大致一样。一般都是用于函数的形参个数大于等于实参个数

    注意点:函数参数的默认值只能出现在最靠右的(不只是指最后一个,可以是连续的倒数几个参数),否则会出现未知错误。当参数存在默认值时,没有实际参数时,会取形参默认值,存在实际参数时,会取实参传递给形参的值。

    //函数参数默认值
    function f1($num1,$num2=10)
    {
        return $num1+$num2;
    }
    echo f1(10);//20,参数2是默认值
    echo f1(10,20);//30
    

    参数变化函数

    正常情况下,我们认为函数的形参个数和实参个数必须是相等的,不然如何调用,但是php的参数是可以不对等的,实参个数可以大于形参个数,可以小于形参个数,当然也可以等于形参个数。我们直接说实参个数大于形参个数和实参个数小于形参个数的情况。

    实参个数小于形参个数:通常就是函数参数带默认值的情况。

    //函数参数默认值
    function f1($num1,$num2=10)
    {
        return $num1+$num2;
    }
    echo f1(10);//20,参数2是默认值
    echo f1(10,20);//30
    

    实参个数大于形参个数:func_get_args()保存函数所有的传递过来的实参。

    function f3()
    {
        $sum = 0;
        echo func_get_args();//1,2,3
        foreach (func_get_args() as $value)
        {
            $sum += $value;
        }
        echo  $sum;//6
    }
    

    php5之后的版本可以用新语法...$变量存放当前未被接受的实参

    //格式
    function f($num1,...$num2)
    {
        //...$num2其实就是个数组,保存数字2,3,4,5
    }
    f(1,2,3,4,5);
    
    //求和,$num3数组保存剩余未匹配的参数
    function func($num1,$num2,...$num3)
    {
        $sum = 0;
        $sum += $num1;
        $sum += $num2;
        foreach($num3 as value)
        {
            sum += value;
        }
        echo sum;
    }
    func(1,2);//3,$num3数组是空
    func(1,2,3)//6,$num3数组存放3
    func(1,2,3,4)//6,$num3数组存放3和4
    

    可变函数

    可变函数是php特有的一种函数,它是用变量的值对应函数的名称去简介的调用函数。

    可变函数的调用有两类,一类是给变量赋不同的值,按照值不同调用不同的函数,还有一类是给变量赋不同的值,用call_user_func_array(变量名,接受函数参数的数组)去调用不同的函数

    格式1示例:

    //函数f1
    function f1()
    {
        echo "f1";
    }
    //函数f2
    function f2($num)
    {
        echo $num;
    }
    //函数f3
    function f3($num)
    {
        return $num+10;
    }
    $num = "f1";
    $num();//f1;
    $num = "f2";
    $num(10);//10;
    $num = "f3";
    echo $num(10);//20;
    

    格式2示例

    //函数f1
    function f1()
    {
        echo "f1";
    }
    //函数f2
    function f2($num)
    {
        echo $num;
    }
    $num = "f1";
    call_user_func_array($num,array());//f1
    $num = "f2";
    call_user_func_array($num,array(10));//10
    

    回调函数

    回调函数就是利用当前函数的参数作为内部调用函数的参数,执行内部函数的过程,通常回调函数就是利用可变函数去完成的。

    我们可以这样理解回调函数,假设当前函数是主线程,在执行当前函数时,突然去调用另一个子线程函数,当子线程执行完后,继续往下执行主线程。回调函数的调用也有两种,一类是正常调用,第二类是用call_user_func_array()调用,call_user_func_array()其实就是前面的可变函数的调用

    无参数回调:

    function f1()
    {
        echo "f1";
    }
    function f2()
    {
        echo "bbb";
        f1();
        echo "ccc";
    }
    f2();//bbbf1ccc
    

    有参数回调

    function f1($num)
    {
        echo $num;
    }
    function f2($num)
    {
        echo "bbb";
        f1($num);
        echo "ccc";
    }
    f2(10);//bbb10ccc
    

    用回调函数模拟加减乘除,用户只需调用一个函数

    //+
    function add($num1=0,$num2=0)
    {
        echo $num1+$num2;
    }
    //-
    function del($num1=0,$num2=0)
    {
        echo $num1-$num2;
    }
    
    //*
    function div($num1=0,$num2=0)
    {
        echo $num1*$num2;
    }
    ///
    function mul($num1=0,$num2=0)
    {
        echo $num1/$num2;
    }
    //用回调函数智能选择函数
    function callback($choice,$num1,$num2)
    {
        $num = $choice;
        //$num($num1,$num2);可变函数格式1
        return call_user_func_array($num,array($num1,$num2));//可变函数格式2
    }
    callback("add",10,20);//30
    callback("del",10,20);//-10
    callback("div",10,20);//200
    callback("mul",20,20);//1
    

    匿名函数

    匿名函数和JavaScript的匿名函数一样,匿名的函数并不是没有名字,简介的将名称给了变量而已。

    //匿名函数格式
    $num = function ($num)
    {
        ...
    };
    
    $num = function()
    {
        echo "ni ming";
    };
    $num();//niming
    

    闭包函数

    闭包就是函数内部有一个匿名函数,且这个函数内部定义的变量和当前函数的参数,匿名函数不可以直接用,只可以通过use(参数1,参数2)传递使用

    function f()
    {
        $num = function()
        {
            echo "i am ni";
        };
        $num();
    }
    
    f();//i am ni
    
    
    
    function fun($num)
    {
        $num = function() use($num)
        {
            echo $num;//不能直接用,必须通过use()传递进去
        };
        $num();
    }
    fun(10);//10
    

    如何调用其它php文件的全局变量/函数/类

    格式:

    • include "php地址"
    • include_once "php地址"
    • require "php地址"
    • require_once "php地址"

    其实总的就两类,include和require,其中后缀加once就是保证不会重复引入php文件。require适合静态引用,在头部引用。而inlude适合动态引用,在程序运行过程中引用。

    //test1.php
    <?php
    $num1 = 100;
    function test1()
    {
        echo  "i am is test1";
    }
    
    //test2.php
    <?php
    $num2 = 10;
    function test2()
    {
        echo  "i am is test2";
    }
    
    //main.php
    require "test1.php";
    echo num1;//100
    test1();//i am is test1
    if(1)
    {
        include "test2.php"
        echo num2;//10
        test2();//i am is test2
    }
    

    相关文章

      网友评论

          本文标题:07-函数

          本文链接:https://www.haomeiwen.com/subject/fftvmctx.html