07-函数

函数

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

你可能感兴趣的:(07-函数)